Med strengtypekolonner som character(2)
(som du nævnte senere), virker den viste sammenkædning bare fordi, med henvisning til manualen:
[...] strengsammenkædningsoperatoren (||
) accepterer ikke-stringinput, så længe mindst én input er af en strengtype , som vist i tabel 9.8. I andre tilfælde skal du indsætte en eksplicit tvang til text
[...]
Fed understregning min. Det andet eksempel (select a||', '||b from foo
) virker for alle datatyper siden den uindskrevne streng literal ', '
standard til at skrive text
gør hele udtrykket gyldigt under alle omstændigheder.
For ikke-strengdatatyper kan du "rette" den første sætning ved at caste mindst ét argument til text
. (Enhver type kan castes til text
):
SELECT a::text || b AS ab FROM foo;
At dømme ud fra dit eget svar, "virker ikke " skulle betyde "returnerer NULL ". Resultatet af hvad som helst sammenkædet med NULL er NULL. Hvis NULL værdier kan være involveret, og resultatet skal ikke være NULL, brug concat_ws()
for at sammenkæde et vilkårligt antal værdier (Postgres 9.1 eller nyere):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Separatorer tilføjes kun mellem ikke-nul-værdier, dvs. kun hvor det er nødvendigt.
Eller concat()
hvis du ikke har brug for separatorer:
SELECT concat(a, b) AS ab FROM foo;
Intet behov for typecasts her, da begge funktioner tager "any"
input og arbejde med tekstgengivelser.
Flere detaljer (og hvorfor COALESCE
er en dårlig erstatning) i dette relaterede svar:
- Kombiner to kolonner og tilføj til én ny kolonne
Angående opdatering i kommentaren
+
er ikke en gyldig operator for strengsammenkædning i Postgres (eller standard SQL). Det er en privat idé af Microsoft at tilføje dette til deres produkter.
Der er næppe nogen god grund til at bruge (synonym:character(n)
). Brug char(n)
text
eller varchar
. Detaljer:
- Er der nogen ulemper ved at bruge datatypen "tekst" til at gemme strenge?
- Bedste måde at tjekke for "tom eller null værdi"