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"