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, (Synonym:character(n)
zu verwenden ). Verwenden Sie char(n)
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