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

演算子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 の回答に対する 1 つの警告 - 元のクエリと新しいクエリの動作はわずかに異なります。すなわち、

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

少なくとも 1 つの行にサプライヤーの割り当てがない場合、NULL 値が含まれます。

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

NULL 値を返しません。

于 2012-10-04T17:35:54.770 に答える