如何使用hstore进行IN查询?

时间:2014-09-25 08:42:31

标签: sql ruby-on-rails postgresql activerecord hstore

我在包含键和值(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, ....)

提前谢谢你

2 个答案:

答案 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)