3 votos

¿Cómo referirse a una clave hstore múltiple similar en PostgreSQL?

Tengo cargados datos de OpenStreetMap en una base de datos PostgreSQL. Una columna de tipo hstore contiene todas las parejas clave=valor. Algunas claves de OSM tienen sufijos como name:en, name:de, name:hu etc.

Me gustaría crear una consulta donde pueda hacer referencia a todas las claves name, tanto la simple name como la sufijada name:en, name.de ... también. Me gustaría ver si hay algún registro donde el valor de cualquiera de las claves name sea igual a 'algún string'.

La solución, absolutamente no elegante y amigable con la memoria, que se me ocurrió:

Seleccionar todas las claves de nombre únicas:

WITH a AS (SELECT DISTINCT(skeys(tags)) as key FROM public.ways)
SELECT key FROM a WHERE key~'^name$' OR key~'^name:';

En un editor de texto, crea una consulta como esta:

WITH string(s1) AS (VALUES('algún string'))
SELECT * FROM public.ways,string WHERE tags->'name' ~ s1 
UNION SELECT * FROM public.ways,string WHERE tags->'name:en' ~ s1 
UNION SELECT * FROM public.ways,string WHERE tags->'name:de' ~ s1;

5voto

ExiaLimbu Puntos 19

Mientras escribía la pregunta, se me ocurrió una solución mejor:

SELECT * FROM public.ways WHERE tags::text~'"name"=>".*"' AND tags::text~'"name:.*"=>".*"'
  • tags::text~'"name"=>".*"' encontrará cada par de clave-valor donde la clave name tiene un valor
  • tags::text~'"name:.*"=>".*"' encontrará cada par de clave-valor donde la clave name con sufijos (como name:en, name:de) tiene un valor

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X