Tenho várias strings como esta:
1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
Preciso retornar tudo depois do segundo dois pontos ( :
). Então, da string acima eu preciso:
NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
Estou vendo muitos exemplos, mas nenhum realmente funciona para essa tarefa.
Isto usa
string_to_array
daqui:https://www.postgresql.org/docs/current/functions-string.html
Isso quebra a string em suas partes componentes e faz um array delas. O
[3:]
seleciona do terceiro ao fim dos elementos do array do array.Então daqui:
https://www.postgresql.org/docs/current/functions-array.html
Isso reconstitui a string concatenando os elementos da matriz com o delimitador.
O mais curto
substring()
com uma expressão regular:A expressão regular explicada:
^
... âncora no início da string (opcional).
... qualquer caractere+?
... 1 ou mais vezes, não ganancioso:
... o caractere literal(2 vezes)
(.*$)
... qualquer caractere 0 ou mais vezes, ganancioso; na captura de parêntesesMais rápido
Se o desempenho importa...
O acima é simples e curto, então ele tem um desempenho decente. Mas expressões regulares são caras. Até mesmo converter (custoso) para um array e voltar como Adrian demonstra é tipicamente mais rápido.
Isso é algumas vezes mais rápido do que qualquer coisa sugerida até agora:
Este retorna uma matriz, dividindo o conteúdo em:
Se você precisar de uma única string:
Este usa uma expressão regular para dividir o conteúdo e também retorna uma matriz, mas apenas um elemento, o que é fácil de converter em uma única string:
O seguinte demonstra o uso de
NULLIF
andREGEXP_REPLACE
com a expressão regular^(([^:]*:){2}(.*))|(.*)
para extrair a parte de uma string que ocorre após um segundo:
, ouNULL
se não houver caracteres após o segundo:
:O script a seguir mede a sobrecarga associada à geração de strings de teste (expressão de teste
s.string||gs.n::TEXT
) e o tempo de execução para cada uma das quatro expressões que retornam a parte da string que ocorre após a segunda:
: