Met kolommen van het tekenreekstype zoals character(2)
(zoals je later al zei), de weergegeven aaneenschakeling werkt gewoon omdat, de handleiding citerend:
[...] de tekenreeksaaneenschakelingsoperator (||
) accepteert niet-tekenreeksinvoer, zolang minstens één invoer van het tekenreekstype is , zoals weergegeven in Tabel 9.8. Voeg voor andere gevallen een expliciete dwang toe aan text
[...]
Vetgedrukte nadruk van mij. Het 2e voorbeeld (select a||', '||b from foo
) werkt voor elke gegevenstypen sinds de ongetypte tekenreeks letterlijk ', '
typt standaard text
waardoor de hele uitdrukking in elk geval geldig is.
Voor niet-tekenreeksgegevenstypen kunt u de eerste instructie "repareren" door ten minste één argument naar text
te casten . (Elke type kan worden gecast naar text
):
SELECT a::text || b AS ab FROM foo;
Afgaande op uw eigen antwoord, "werkt niet " moest betekenen "geeft NULL terug ". Het resultaat van alles aaneengeschakeld naar NULL is NULL. Als NULL waarden kunnen betrokken zijn en het resultaat mag niet NULL zijn, gebruik concat_ws()
om een willekeurig aantal waarden samen te voegen (Postgres 9.1 of hoger):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Scheidingstekens worden alleen toegevoegd tussen niet-null-waarden, d.w.z. alleen waar nodig.
Of concat()
als u geen scheidingstekens nodig heeft:
SELECT concat(a, b) AS ab FROM foo;
Typecasts zijn hier niet nodig, aangezien beide functies "any"
. gebruiken invoer en werk met tekstrepresentaties.
Meer details (en waarom COALESCE
is een slechte vervanging) in dit gerelateerde antwoord:
- Combineer twee kolommen en voeg toe aan één nieuwe kolom
Over update in de opmerking
+
is geen geldige operator voor het samenvoegen van tekenreeksen in Postgres (of standaard SQL). Het is een persoonlijk idee van Microsoft om dit aan hun producten toe te voegen.
Er is nauwelijks een goede reden om (synoniem:character(n)
te gebruiken ). Gebruik char(n)
text
of varchar
. Details:
- Enige nadelen van het gebruik van datatype "text" voor het opslaan van strings?
- Beste manier om te controleren op "lege of null-waarde"