21

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

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

4

2 回答 2

43

您可以使用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列。请参阅关于索引类型的注释,了解与 LIKE 的索引用法。

于 2012-09-20T20:35:46.760 回答
8

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

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

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

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

不会返回 NULL 值。

于 2012-10-04T17:35:54.770 回答