Postgres Запрос массива с использованием LIKE
Я запрашиваю базу данных в Postgres, используя psql. Я использовал следующий запрос для поиска в поле под названием теги, у которого есть массив текста в виде его типа:
select count(*) from planet_osm_ways where 'highway' = ANY(tags);
Теперь мне нужно создать запрос, который ищет поля тегов для любого слова, начинающегося с буквы "A". Я попробовал следующее:
select count(*) from planet_osm_ways where 'A%' LIKE ANY(tags);
Это дает мне синтаксическую ошибку. Любые предложения о том, как использовать LIKE с массивом текста?
Ответы
Ответ 1
Используйте функцию 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
. Способ хранения тегов теперь делает невозможным использование индексов при поиске тегов, а это означает, что каждый поиск выполняет полное сканирование таблицы.
Ответ 2
Вот еще один способ сделать это в 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%'
)
);