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, text
sodass 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 COALESCE
ist 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 text
odervarchar
. Einzelheiten:
text
Typ?