Con colonne di tipo stringa come character(2)(come menzionato più avanti), la concatenazione visualizzata funziona solo perché, citando il manuale:
[...] l'operatore di concatenazione di stringhe ( ||) accetta input non stringa, purché almeno un input sia di tipo stringa , come mostrato nella
Tabella 9.8 . Per altri casi, inserire una coercizione esplicita a text[...]
Enorme enfasi sulla mia. Il 2o esempio ( select a||', '||b from foo) funziona per qualsiasi tipo di dato poiché la stringa non tipizzata viene impostata per ', 'impostazione predefinita textrendendo l'intera espressione valida in ogni caso.
Per i tipi di dati non stringa, è possibile "correggere" la prima istruzione eseguendo il cast di almeno un argomento text. ( È possibile eseguire il cast di qualsiasi tipo text):
SELECT a::text || b AS ab FROM foo;
A giudicare dalla tua risposta , " non funziona " avrebbe dovuto significare " restituisce NULL ". Il risultato di qualsiasi cosa concatenata a NULL è NULL. Se possono essere coinvolti valori NULL e il risultato non deve essere NULL, utilizzare concat_ws()per concatenare un numero qualsiasi di valori (Postgres 9.1 o successivo):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
O concat()se non hai bisogno di separatori:
SELECT concat(a, b) AS ab FROM foo;
Non è necessario eseguire il cast di tipi qui poiché entrambe le funzioni accettano "any"input e funzionano con rappresentazioni di testo.
Maggiori dettagli (e perché COALESCEè un cattivo sostituto) in questa risposta correlata:
Per quanto riguarda l'aggiornamento nel commento
+non è un operatore valido per la concatenazione di stringhe in Postgres (o SQL standard). È un'idea privata di Microsoft aggiungere questo ai loro prodotti.
Non c'è quasi nessun buon motivo per usare character(n)(sinonimo:) char(n). Usa textovarchar . Dettagli:
texttipo?