Подтвердить что ты не робот

Как запрашивать значения с помощью подстановочных знаков в 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%'

для поиска без учета регистра. Как это делается?

4b9b3361

Ответ 1

Вы можете извлечь значения с помощью ключа из столбца 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.

Ответ 2

Одно предупреждение о том, что любой человек увидит это в будущем - исходный запрос и новый запрос имеют несколько другое поведение. А именно,

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

будет включать значение NULL, предполагающее, что хотя бы одна строка не имеет назначения для Поставщика.

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

не вернет значение NULL.