Dada a sequência:
'Eu acho que o PostgreSQL é bacana'
Eu gostaria de operar com as palavras individuais encontradas nessa sequência. Essencialmente, eu tenho uma parte separada da qual posso obter detalhes de palavras e gostaria de ingressar em uma matriz não aninhada dessa sequência neste dicionário.
Até agora eu tenho:
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;
Isso realiza os fundamentos do que eu esperava fazer, mas não preserva a ordem das palavras original.
Pergunta relacionada:
PostgreSQL unnest () com número do elemento
postgresql
sorting
array
parse
swasheck
fonte
fonte
Respostas:
WITH ORDINALITY
no Postgres 9.4 ou posteriorO novo recurso simplifica essa classe de problemas. A consulta acima agora pode ser simplesmente:
Ou, aplicado a uma tabela:
Detalhes:
Sobre a
LATERAL
junção implícita :Postgres 9.3 ou mais antigo - e explicação mais geral
Para uma única sequência
Você pode aplicar a função de janela
row_number()
para lembrar a ordem dos elementos. No entanto, com o habitual,row_number() OVER (ORDER BY col)
você obtém números de acordo com a ordem de classificação , não a posição original na string.Você pode tentar e simplesmente omitir o
ORDER BY
para obter a posição "como está":Desempenho de
regexp_split_to_table()
degradas com cordas longas.unnest(string_to_array(...))
escala melhor:No entanto, enquanto isso normalmente funciona e eu nunca o vi quebrar em consultas simples, o PostgreSQL não afirma nada sobre a ordem das linhas sem um explícito
ORDER BY
.Para garantir números ordinais de elementos na string original, use
generate_subscript()
(aprimorado com o comentário de @deszo):Para uma tabela de cordas
Adicione
PARTITION BY id
àOVER
cláusula ...Tabela de demonstração:
Eu uso
ctid
como substituto ad-hoc para uma chave primária . Se você tiver uma (ou qualquer coluna exclusiva ), use-a.Isso funciona sem nenhum ID distinto:
SQL Fiddle.
Resposta à pergunta
fonte
SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....
. As 9.3LATERAL
podem fornecer soluções mais agradáveis para esse problema.generate_subscripts(arr, 1)
funcionaria em vez degenerate_series(1, array_upper(arr, 1))
? Eu preferiria o primeiro por clareza.