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 paratext[...]
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) char(n) text ou varchar . Detalhes:- Alguma desvantagem de usar o tipo de dados "texto" para armazenar strings?
- Melhor maneira de verificar "valor vazio ou nulo"