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%'
  )
);