Dada a string:
'Eu acho que o PostgreSQL é bacana'
Eu gostaria de operar nas palavras individuais encontradas dentro dessa string. Essencialmente, tenho um separado do qual posso obter detalhes da palavra e gostaria de ingressar em uma matriz não aninhada dessa string 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 cumpre os fundamentos do que eu esperava fazer, mas não preserva a ordem original das palavras.
Questão relacionada:
PostgreSQL unnest() com número de elemento
WITH ORDINALITY
no Postgres 9.4 ou posteriorA consulta agora pode ser simplesmente:
Ou, aplicado a uma tabela:
Detalhes:
LATERAL
Sobre a junção implícita :db<>fiddle aqui
Old sqlfiddle
Postgres 9.3 ou anterior - e uma explicação mais geral
Para uma única cadeia
Você pode aplicar a função de janela
row_number()
para lembrar a ordem dos elementos. No entanto, com o usual,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 simplesmente omitir
ORDER BY
para obter a posição "como está":Desempenho de
regexp_split_to_table()
degrada com strings longas.unnest(string_to_array(...))
escala melhor:No entanto, embora isso normalmente funcione e eu nunca o tenha visto quebrar em consultas simples, o Postgres não afirma nada quanto à ordem das linhas sem um
ORDER BY
.Para garantir números ordinais de elementos na string original, use
generate_subscript()
(melhorado com comentário de @deszo):Para uma tabela de strings
Adicionar
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 qualquer ID distinto:
Resposta à pergunta