Dada la cadena:
'Creo que PostgreSQL es ingenioso'
Me gustaría operar en las palabras individuales que se encuentran dentro de esa cadena. Esencialmente, tengo un separador del cual puedo obtener detalles de palabras y me gustaría unirme a una matriz no verificada de esa cadena en este diccionario.
Hasta ahora tengo:
select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;
Esto logra los fundamentos de lo que esperaba hacer, pero no conserva el orden original de las palabras.
Pregunta relacionada:
PostgreSQL unnest () con número de elemento
postgresql
sorting
array
parse
swasheck
fuente
fuente
Respuestas:
WITH ORDINALITY
en Postgres 9.4 o posteriorLa nueva característica simplifica esta clase de problemas. La consulta anterior ahora puede ser simplemente:
O, aplicado a una tabla:
Detalles:
Sobre la
LATERAL
unión implícita :Postgres 9.3 o anterior - y una explicación más general
Para una sola cadena
Puede aplicar la función de ventana
row_number()
para recordar el orden de los elementos. Sin embargo, con lo habitualrow_number() OVER (ORDER BY col)
se obtienen números según el orden de clasificación , no la posición original en la cadena.Simplemente puede omitir
ORDER BY
para obtener la posición "tal cual":Rendimiento de
regexp_split_to_table()
degrada con cuerdas largas.unnest(string_to_array(...))
escala mejor:Sin embargo, aunque esto normalmente funciona y nunca lo he visto romperse en consultas simples, Postgres no afirma nada en cuanto al orden de las filas sin un explícito
ORDER BY
.Para garantizar números ordinales de elementos en la cadena original, use
generate_subscript()
(mejorado con comentarios de @deszo):Para una mesa de cuerdas
Agregar
PARTITION BY id
a laOVER
cláusula ...Tabla de demostración:
Lo uso
ctid
como sustituto ad-hoc para una clave primaria . Si tiene una (o una columna única ), úsela.Esto funciona sin ninguna identificación distinta:
SQL Fiddle.
Respuesta a la pregunta
fuente
SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....
. 9.3LATERAL
podría proporcionar mejores soluciones a este problema.generate_subscripts(arr, 1)
funcionaría en lugar degenerate_series(1, array_upper(arr, 1))
? Prefiero lo primero por claridad.