Bei Spalten vom Typ Zeichenfolge wie character(2)(wie Sie später erwähnt haben) funktioniert die angezeigte Verkettung nur, weil unter Berufung auf das Handbuch:
[...] Der String-Verkettungsoperator ( ||) akzeptiert Eingaben ohne String, solange mindestens eine Eingabe vom Typ String ist (siehe
Tabelle 9.8) . Fügen Sie in anderen Fällen einen expliziten Zwang ein, um text[...]
Meine kühne Betonung. Das zweite Beispiel ( select a||', '||b from foo) funktioniert für alle Datentypen, da das nicht typisierte Zeichenfolgenliteral ', 'standardmäßig den Typ angibt, textsodass der gesamte Ausdruck in jedem Fall gültig ist.
Bei Datentypen ohne Zeichenfolge können Sie die erste Anweisung "korrigieren", indem Sie mindestens ein Argument in " Casting " umwandeln text. ( Jeder Typ kann gegossen werden text):
SELECT a::text || b AS ab FROM foo;
Nach Ihrer eigenen Antwort zu urteilen , sollte " funktioniert nicht " " NULL zurückgeben " bedeuten . Das Ergebnis von allem, was mit NULL verkettet ist, ist NULL. Wenn NULL- Werte beteiligt sein können und das Ergebnis nicht NULL sein soll, verwenden Sie diese Option, um concat_ws()eine beliebige Anzahl von Werten zu verketten (Postgres 9.1 oder höher):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Oder concat()wenn Sie keine Trennzeichen benötigen:
SELECT concat(a, b) AS ab FROM foo;
Hier sind keine Typumwandlungen erforderlich, da beide Funktionen "any"Eingaben vornehmen und mit Textdarstellungen arbeiten.
Weitere Details (und warum COALESCEist ein schlechter Ersatz) in dieser verwandten Antwort:
+ist kein gültiger Operator für die Verkettung von Zeichenfolgen in Postgres (oder Standard-SQL). Es ist eine private Idee von Microsoft, dies zu ihren Produkten hinzuzufügen.
Es gibt kaum einen guten Grund character(n)(synonym :) char(n). Verwenden Sie textodervarchar . Einzelheiten:
textTyp?