PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come concatenare le colonne in un Postgres SELECT?

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 character(n) (sinonimo:char(n) ). Usa 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"