Есть ли способ запросить наличие определенных ключей в поле hstore PostgreSQL с использованием подстановочных знаков? - PullRequest
3 голосов
/ 24 августа 2011

Я хочу отфильтровать записи в таблице PostgreSQL 9.0, основываясь на существовании (или, скорее, несуществовании) определенных ключей в столбце hstore. Прямо сейчас я перечисляю всех отдельных кандидатов следующим образом:

SELECT AVG(array_upper(%# tags,1)) FROM nodes 
WHERE array_upper(%# tags,1) > 0 AND NOT 
tags?|ARRAY['gnis:state_id','gnis:id','gnis:Class','gnis:County',
'gnis:ST_num','gnis:ST_alpha','gnis:County_num','gnis:reviewed',
'gnis:feature_id','gnis:county_name','gnis:import_uuid'];

Что я действительно хочу сделать, так это подсчитать среднее количество пар ключ-значение в этом столбце, исключая тех, которые содержат любой ключ, начинающийся с "gnis:". Есть ли более эффективный способ сделать это?

1 Ответ

4 голосов
/ 24 августа 2011

Как я знаю, hstore модуль не поддерживает вилки в простой форме, которую вы хотите. Однако реализовать такую ​​функциональность легко, например:

WITH excluded_tags AS
(
    SELECT array_agg(key) AS tags
    FROM (SELECT skeys(tags) AS key FROM nodes) k
    WHERE key LIKE 'gnis:%'
)
SELECT avg(array_upper(%# tags, 1))
FROM nodes
WHERE array_upper(%# tags, 1) > 0
    AND NOT tags ?| (SELECT tags FROM excluded_tags);

или намного короче:

SELECT avg(array_upper(%# tags, 1))
FROM nodes 
WHERE array_upper(%# tags, 1) > 0 AND
    NOT EXISTS (SELECT skeys FROM skeys(tags) WHERE skeys LIKE 'gnis:%');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...