【问题标题】:How to make a IN query with hstore?如何使用 hstore 进行 IN 查询?
【发布时间】:2014-11-19 23:09:23
【问题描述】:

我在包含键和值(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 的行。

在经典 SQL 中,它会是这样的:

SELECT * FROM TABLE WHERE category_id IN (27, 28, 29, ....)

提前谢谢你

【问题讨论】:

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


    【解决方案1】:

    取消引用密钥并正常使用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 contains 操作,例如使用多个键,您可以使用@> ANY,例如

    SELECT *
    FROM hstoredemo
    WHERE 
      content @> ANY(
        ARRAY[
          '"category_id"=>"27","product_id"=>"27"',
          '"category_id"=>"2","product_id"=>"27"'
        ]::hstore[]
      );
    

    但它并不漂亮,而且会慢很多,所以除非迫不得已,否则不要这样做。

    【讨论】:

    • @Sucrenoir 感谢展示了所需的 SQL 和数据,使这个答案快速简单,无需来回。
    【解决方案2】:
    category_ids = ["27", "28", "29"]
    Tablename.where("category_id IN(?)", category_ids)
    

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多