我在包含键和值(hstore)的表中有一个字段(内容),如下所示:
content: {"price"=>"15.2", "quantity"=>"3", "product_id"=>"27", "category_id"=>"2", "manufacturer_id"=>"D"}
我可以轻松地选择具有ONE category_id的产品:
SELECT * FROM table WHERE "content @> 'category_id=>27'"
我想选择具有(例如)category_id IN值列表的所有行。
在经典SQL中,它将是这样的:
SELECT * FROM TABLE WHERE category_id IN (27, 28, 29, ....)
提前谢谢你
答案 0 :(得分:2)
取消引用密钥并正常使用IN
进行测试。
CREATE TABLE hstoredemo(content hstore not null);
INSERT INTO hstoredemo(content) VALUES
('"price"=>"15.2", "quantity"=>"3", "product_id"=>"27", "category_id"=>"2", "manufacturer_id"=>"D"');
然后其中之一。第一个是更干净的,因为它将提取的值转换为整数而不是对数字进行字符串比较。
SELECT *
FROM hstoredemo
WHERE (content -> 'category_id')::integer IN (2, 27, 28, 29);
SELECT *
FROM hstoredemo
WHERE content -> 'category_id' IN ('2', '27', '28', '29');
如果你必须测试更复杂的hstore包含操作,比如使用多个键,你可以使用@> ANY
,例如
SELECT *
FROM hstoredemo
WHERE
content @> ANY(
ARRAY[
'"category_id"=>"27","product_id"=>"27"',
'"category_id"=>"2","product_id"=>"27"'
]::hstore[]
);
但它并不漂亮,而且速度要慢得多,所以除非必须这样做,否则不要这样做。
答案 1 :(得分:-2)
category_ids = ["27", "28", "29"]
Tablename.where("category_id IN(?)", category_ids)