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