web-dev-qa-db-ja.com

PostgreSQLhstoreでワイルドカードを使用して値をクエリする方法

検索条件に一致する特定のキーのすべての値について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%'

大文字と小文字を区別しない検索用。これはどのように行われますか?

17
Rob Gonzalez

_->_演算子 を使用して、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でのインデックスの使用については、 インデックスタイプ に関する注記を参照してください。

34
willglynn

将来これを見た人に対するwillglynnの答えに対する1つの警告-元のクエリと新しいクエリの動作はわずかに異なります。つまり、

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

少なくとも1つの行にSupplierの割り当てがないと仮定すると、NULL値が含まれます。

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

nULL値を返しません。

8
jredburn