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 text
rendendo 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 text
ovarchar
. Dettagli:
text
tipo?