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 ORDINALITYen 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
LATERALunió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 BYpara 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 ida laOVERcláusula ...Tabla de demostración:
Lo uso
ctidcomo 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.3LATERALpodrí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.