如何在PostgreSQL hstore中使用通配符查询值

时间:2012-09-20 20:24:53

标签: postgresql hstore

我正在尝试向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%'

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

2 个答案:

答案 0 :(得分:31)

您可以使用-> operatorhstore列按键提取值。

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索引使用情况的说明。

答案 1 :(得分:6)

对于任何在未来看到这一点的人来说,willglynn的答案有一点需要注意 - 原始查询和新查询的行为略有不同。即,

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

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

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

不会返回NULL值。