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"