PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verkettet man Spalten in einem Postgres SELECT?

Mit Zeichenfolgenspalten wie character(2) (wie Sie später erwähnt haben) funktioniert die angezeigte Verkettung nur, weil das Handbuch zitiert wird:

[...] String-Verkettungsoperator (|| ) akzeptiert Nicht-String-Eingaben, solange mindestens eine Eingabe vom Typ String ist , wie in Tabelle 9.8 gezeigt. Fügen Sie für andere Fälle eine explizite Zwangsbedingung für text ein [...]

Fette Hervorhebung von mir. Das zweite Beispiel (select a||', '||b from foo ) funktioniert für alle Datentypen seit dem untypisierten String-Literal ', ' gibt standardmäßig text ein wodurch der gesamte Ausdruck in jedem Fall gültig wird.

Bei Nicht-String-Datentypen können Sie die erste Anweisung "korrigieren", indem Sie mindestens ein Argument in text umwandeln . (Alle type kann in text umgewandelt werden ):

SELECT a::text || b AS ab FROM foo;

Ihrer eigenen Antwort nach zu urteilen, "funktioniert nicht " sollte bedeuten "gibt NULL zurück ". Das Ergebnis von alles mit NULL verkettet ist NULL. Wenn NULL Werte beteiligt sein können und das Ergebnis nicht NULL sein darf, verwenden Sie concat_ws() um eine beliebige Anzahl von Werten zu verketten (Postgres 9.1 oder höher):

SELECT concat_ws(', ', a, b) AS ab FROM foo;

Trennzeichen werden nur zwischen Nicht-Null-Werten hinzugefügt, d. h. nur dort, wo es notwendig ist.

Oder concat() wenn Sie keine Trennzeichen benötigen:

SELECT concat(a, b) AS ab FROM foo;

Typumwandlungen sind hier nicht erforderlich, da beide Funktionen "any" annehmen Eingabe und Arbeit mit Textdarstellungen.

Weitere Details (und warum COALESCE ist ein schlechter Ersatz) in dieser verwandten Antwort:

  • Zwei Spalten kombinieren und zu einer neuen Spalte hinzufügen

Bezüglich Update im Kommentar

+ ist kein gültiger Operator für die Zeichenfolgenverkettung in Postgres (oder Standard-SQL). Es ist eine private Idee von Microsoft, dies ihren Produkten hinzuzufügen.

Es gibt kaum einen guten Grund, character(n) zu verwenden (Synonym:char(n) ). Verwenden Sie text oder varchar . Einzelheiten:

  • Irgendwelche Nachteile bei der Verwendung des Datentyps „Text“ zum Speichern von Strings?
  • Beste Möglichkeit, auf "leeren oder Nullwert" zu prüfen