Con colonne di tipo stringa come character(2)
(come accennato in seguito), la concatenazione visualizzata funziona proprio perché, citando il manuale:
[...] l'operatore di concatenazione di stringhe (||
) accetta input non-string, purché almeno un input sia di tipo stringa , come mostrato nella Tabella 9.8. Per gli altri casi, inserisci una coercizione esplicita a text
[...]
Enfasi in grassetto mio. Il 2° esempio (select a||', '||b from foo
) funziona per qualsiasi tipi di dati dal valore letterale della stringa non tipizzata ', '
per impostazione predefinita digitare text
rendendo comunque valida l'intera espressione.
Per i tipi di dati non stringa, puoi "correggere" la prima istruzione lanciando almeno un argomento su text
. (Qualsiasi type può essere trasmesso a text
):
SELECT a::text || b AS ab FROM foo;
A giudicare dalla tua stessa risposta, "non funziona " doveva significare "restituisce NULL ". Il risultato di qualsiasi cosa concatenato a NULL è NULL. Se NULL possono essere coinvolti valori 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;
I separatori vengono aggiunti solo tra valori non nulli, cioè solo dove necessario.
Oppure concat()
se non hai bisogno di separatori:
SELECT concat(a, b) AS ab FROM foo;
Non c'è bisogno di cast di tipo qui poiché entrambe le funzioni accettano "any"
inserire e lavorare con le rappresentazioni di testo.
Maggiori dettagli (e perché COALESCE
è un povero sostituto) in questa risposta correlata:
- Unisci due colonne e aggiungi in una nuova colonna
Riguardo all'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 propri prodotti.
Non c'è quasi nessuna buona ragione per usare (sinonimo:character(n)
). Usa char(n)
text
o varchar
. Dettagli:
- Qualche aspetto negativo dell'utilizzo del tipo di dati "testo" per la memorizzazione di stringhe?
- Il modo migliore per verificare la presenza di "valore vuoto o nullo"