【问题标题】:How to query values with wildcards in PostgreSQL hstore如何在 PostgreSQL hstore 中使用通配符查询值
【发布时间】:2013-11-23 23:11:24
【问题描述】:

我正在尝试在 hstore 中查询与搜索条件匹配的某个键的所有值。

我可以像这样获取某个键的所有值:

SELECT DISTINCT
svals(slice(data, ARRAY['Supplier']))
FROM "products"

我也可以得到一个具体的值:

SELECT DISTINCT
svals(slice(data, ARRAY['Supplier'])) AS sup
FROM "products"
WHERE data @> 'Supplier => Toshiba'

我真正想要的是(这行不通):

SELECT DISTINCT
svals(slice(data, ARRAY['Supplier'])) AS sup
FROM "products"
WHERE data @> 'Supplier => %tosh%'

或:

SELECT DISTINCT
svals(slice(data, ARRAY['Supplier'])) AS sup
FROM "products"
WHERE lower(sup)
LIKE '%tosh%'

用于不区分大小写的搜索。这是怎么做到的?

【问题讨论】:

    标签: postgresql hstore


    【解决方案1】:

    您可以使用-> operator 键从hstore 列中提取值。

    SELECT data->'Supplier' AS sup
    FROM products
    WHERE lower(data->'Supplier') LIKE '%tosh%';
    

    此外,与 PostgreSQL 中的大多数表达式一样(random() 之类的除外),您可以索引此值:

    CREATE INDEX products_supplier_key ON products ((data->'Supplier'));
    CREATE INDEX products_supplier_lowercase_key ON products ((lower(data->'Supplier')));
    

    这将允许 PostgreSQL 使用索引来回答许多此类查询,而不是获取每一行并扫描hstore 列。请参阅Index Types 上有关 LIKE 索引使用的说明。

    【讨论】:

    • 工作就像一个魅力。谢谢,willglynn!
    • 快速跟进:有没有办法确保所有键都被自动索引?
    • 第一个答案:没有。每个键都需要在一个单独的索引中(假设您想要 B 树,您需要这样做来进行那种匹配),并且添加大量索引通常是一个坏主意。
    • 第二个答案:sure, why not。 PostgreSQL 数据结构本身由数据结构表示,而 PostgreSQL 允许您运行过程,因此您可以做任何您想做的事情。将其包裹在 EXECUTE IMMEDIATE 中——或者更糟糕的是,将其折叠成触发器——留给读者作为练习。
    • willglynn:再次感谢。你在这件事上为我节省了很多时间。我真的很感激。
    【解决方案2】:

    对于将来看到此问题的任何人,willglynn 的回答有一个警告——原始查询和新查询的行为略有不同。即,

    SELECT data->'Supplier' AS sup
    FROM products;
    

    将包含一个 NULL 值,假设至少有一行没有分配给供应商。

    SELECT DISTINCT
    svals(slice(data, ARRAY['Supplier']))
    FROM "products"
    

    不会返回 NULL 值。

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      相关资源
      最近更新 更多