Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Postgres Query of an Array using LIKE

I am querying a database in Postgres using psql. I have used the following query to search a field called tags that has an array of text as it's data type:

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

I now need to create a query that searches the tags fields for any word starting with the letter 'A'. I tried the following:

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

This gives me a syntax error. Any suggestions on how to use LIKE with an array of text?

like image 811
nix Avatar asked Aug 28 '11 16:08

nix


2 Answers

Use the unnest() function to convert array to set of rows:

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

The count(dictinct id) should count unique entries from planet_osm_ways table, just replace id with your primary key's name.

That being said, you should really think about storing tags in a separate table, with many-to-one relationship with planet_osm_ways, or create a separate table for tags that will have many-to-many relationship with planet_osm_ways. The way you store tags now makes it impossible to use indexes while searching for tags, which means that each search performs a full table scan.

like image 171
piotrp Avatar answered Sep 20 '22 21:09

piotrp


Here is another way to do it within the WHERE clause:

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%'
  )
);
like image 25
Rotareti Avatar answered Sep 21 '22 21:09

Rotareti