PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como concatenar colunas em um SELECT do Postgres?


Com colunas do tipo string como character(2) (como você mencionou mais tarde), a concatenação exibida só funciona porque, citando o manual:

[...] o operador de concatenação de strings (|| ) aceita entrada não string, desde que pelo menos uma entrada seja do tipo string , conforme mostrado na Tabela 9.8. Para outros casos, insira uma coerção explícita para text [...]

Minha ênfase em negrito. O 2º exemplo (select a||', '||b from foo ) funciona para qualquer tipos de dados desde o literal de string não tipado ', ' o padrão é digitar text tornando toda a expressão válida em qualquer caso.

Para tipos de dados não string, você pode "consertar" a primeira instrução lançando pelo menos um argumento para text . (Qualquer o tipo pode ser convertido em text ):
SELECT a::text || b AS ab FROM foo;

A julgar pela sua própria resposta, "não funciona " deveria significar "retorna NULL ". O resultado de qualquer coisa concatenado com NULL é NULL. Se NULO valores podem estar envolvidos e o resultado não deve ser NULL, use concat_ws() para concatenar qualquer número de valores (Postgres 9.1 ou posterior):
SELECT concat_ws(', ', a, b) AS ab FROM foo;

Os separadores são adicionados apenas entre valores não nulos, ou seja, apenas quando necessário.

Ou concat() se você não precisar de separadores:
SELECT concat(a, b) AS ab FROM foo;

Não há necessidade de conversão de tipo aqui, pois ambas as funções usam "any" entrada e trabalhar com representações de texto.

Mais detalhes (e por que COALESCE é um substituto ruim) nesta resposta relacionada:
  • Combine duas colunas e adicione em uma nova coluna

Sobre a atualização no comentário


+ não é um operador válido para concatenação de strings no Postgres (ou SQL padrão). É uma ideia privada da Microsoft adicionar isso aos seus produtos.

Quase não há uma boa razão para usar character(n) (sinônimo:char(n) ). Use text ou varchar . Detalhes:
  • Alguma desvantagem de usar o tipo de dados "texto" para armazenar strings?
  • Melhor maneira de verificar "valor vazio ou nulo"