Generelt er jeg enig i @kgrittns råd. Gå til det.
Men for at løse dit grundlæggende spørgsmål om concat()
:Den nye funktion concat()
er nyttig, hvis du har brug for at håndtere null-værdier - og null er hverken udelukket i dit spørgsmål eller i det du henviser til.
Hvis du kan udelukke null-værdier, den gode gamle (SQL-standard) sammenkædningsoperator ||
er stadig det bedste valg, og @luis' svar er helt fint:
SELECT col_a || col_b;
Hvis en af dine kolonner kan være null, resultatet ville være null i så fald. Du kan forsvare med COALESCE
:
SELECT COALESCE(col_a, '') || COALESCE(col_b, '');
Men det bliver hurtigt kedeligt med flere argumenter. Det er her concat()
kommer ind, hvilket aldrig returnerer null, ikke engang hvis alle argumenter er nul. Per dokumentation:
NULL-argumenter ignoreres.
SELECT concat(col_a, col_b);
Den resterende hjørnekasse for begge alternativer er alle inputkolonner er null i så fald får vi stadig en tom streng ''
, men man vil måske have null i stedet for (det ville jeg i hvert fald). En mulig måde:
SELECT CASE
WHEN col_a IS NULL THEN col_b
WHEN col_b IS NULL THEN col_a
ELSE col_a || col_b
END;
Dette bliver hurtigt mere komplekst med flere kolonner. Igen, brug concat()
men tilføj en check for den særlige tilstand:
SELECT CASE WHEN (col_a, col_b) IS NULL THEN NULL
ELSE concat(col_a, col_b) END;
Hvordan fungerer dette? (col_a, col_b)
er stenografi for et rækketypeudtryk ROW (col_a, col_b)
. Og en rækketype er kun nul, hvis alle kolonner er nul. Detaljeret forklaring:
- IKKE NULL-begrænsning over et sæt kolonner
Brug også concat_ws()
for at tilføje separatorer mellem elementer (ws
for "med separator").
Et udtryk som det i Kevins svar:
SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;
er kedeligt at forberede null-værdier i PostgreSQL 8.3 (uden concat()
). En måde (af mange):
SELECT COALESCE(
CASE
WHEN $1.zipcode IS NULL THEN $1.city
WHEN $1.city IS NULL THEN $1.zipcode
ELSE $1.zipcode || ' - ' || $1.city
END, '')
|| COALESCE(', ' || $1.state, '');
Funktionsvolatilitet er kun STABLE
concat()
og concat_ws()
er STABLE
funktioner, ikke IMMUTABLE
fordi de kan påkalde datatype output-funktioner (såsom timestamptz_out
), der afhænger af lokalitetsindstillinger.
Forklaring af Tom Lane.
Dette forbyder deres direkte brug i indeksudtryk. Hvis du ved det at resultatet faktisk er uforanderligt i dit tilfælde, kan du omgå dette med en IMMUTABLE
funktionsindpakning. Eksempel her:
- Understøtter PostgreSQL "accentufølsomme" sammenstillinger?