Estou usando o Postgres 9.5. Eu tenho uma tabela com uma coluna que registra URLs. Às vezes, a URL tem uma string de consulta e às vezes não. Eu gostaria de extrair o URL, menos qualquer string de consulta, então criei:
select substring(url, 0, case position('?' in url) when 0 then length(url)+1 else position('?' in url) end)
from article;
Isso parece um pouco prolixo e eu queria saber se há uma maneira mais concisa de fazer isso. Minha coluna da tabela é do tipo TEXT
.
Você pode usar
regexp_replace()
para substituir tudo após o primeiro?
por nada:O exemplo a seguir:
retorna:
Sugiro
split_part()
para isso, certamente mais conciso e simples e substancialmente mais barato que expressões regulares também:Faz exatamente o que você quer. Se não houver '?', a string inteira será o resultado.
db<>fique aqui
Relacionado:
Ou você pode fazer isso usando uma instrução simples
CASE
.Não tenho certeza das implicações de desempenho, mas tenho a sensação de que
CASE
deveria ter mais desempenho - tentarei testar quando chegar em casa - feriado hoje!Confira o violino aqui :
Resultado:
Esta solução não se baseia em nenhuma outra suposição além do requisito de que a exclusão ocorra do primeiro ponto de interrogação até o final, que é a mesma suposição que a outra solução faz.