Postgres Query of Array используя LIKE - PullRequest
       2

Postgres Query of Array используя LIKE

13 голосов
/ 28 августа 2011

Я запрашиваю базу данных в Postgres, используя psql. Я использовал следующий запрос для поиска в поле с именем tags , которое имеет массив текста в качестве типа данных:

select count(*) from planet_osm_ways where 'highway' = ANY(tags);

Теперь мне нужно создать запрос, который ищет в полях tags любое слово, начинающееся с буквы «A». Я попробовал следующее:

select count(*) from planet_osm_ways where 'A%' LIKE ANY(tags);

Это дает мне синтаксическую ошибку. Любые предложения о том, как использовать LIKE с массивом текста?

Ответы [ 2 ]

17 голосов
/ 28 августа 2011

Используйте функцию unnest() для преобразования массива в набор строк:

SELECT count(distinct id)
FROM (
    SELECT id, unnest(tags) tag
    FROM planet_osm_ways) x
WHERE tag LIKE 'A%'

count(dictinct id) должен считать уникальные записи из таблицы planet_osm_ways, просто замените id на имя вашего первичного ключа.

При этом вам следует подумать о хранении тегов в отдельной таблице с отношением "многие к одному" с planet_osm_ways или создать отдельную таблицу для тегов, которая будет иметь отношение "многие ко многим" с planet_osm_ways. То, как вы сохраняете теги, теперь делает невозможным использование индексов при поиске тегов, что означает, что каждый поиск выполняет полное сканирование таблицы.

0 голосов
/ 27 марта 2019

Вот еще один способ сделать это в предложении WHERE:

SELECT COUNT(*)
FROM planet_osm_ways 
WHERE (
  0 < (
    SELECT COUNT(*) 
    FROM unnest(planet_osm_ways) AS planet_osm_way
    WHERE planet_osm_way LIKE 'A%'
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...