Med kolumner av strängtyp som character(2)
(som du nämnde senare), den visade sammanlänkningen fungerar bara eftersom, med hänvisning till manualen:
[...] strängsammansättningsoperatorn (
||
) accepterar icke-stränginmatning, så länge som minst en ingång är av en strängtyp , som visas i Tabell 9.8. För andra fall, infoga ett uttryckligt tvång tilltext
[...]
Djärv betoning min. Det andra exemplet (select a||', '||b from foo
) fungerar för alla datatyper sedan den oskrivna strängen literal ', '
standardtyp text
vilket gör hela uttrycket giltigt i alla fall.
För icke-strängdatatyper kan du "fixa" den första satsen genom att casta minst ett argument till text
. (Alla typ kan casta till text
):
SELECT a::text || b AS ab FROM foo;
Att döma av ditt eget svar, "fungerar inte " skulle betyda "returnerar NULL ". Resultatet av vad som helst sammanlänkade med NULL är NULL. Om NULL värden kan vara involverade och resultatet ska inte vara NULL, använd concat_ws()
för att sammanfoga valfritt antal värden (Postgres 9.1 eller senare):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Separatorer läggs endast till mellan icke-nullvärden, dvs endast där det är nödvändigt.
Eller concat()
om du inte behöver separatorer:
SELECT concat(a, b) AS ab FROM foo;
Inget behov av typcasts här eftersom båda funktionerna tar "any"
mata in och arbeta med textrepresentationer.
Mer information (och varför COALESCE
är ett dåligt substitut) i detta relaterade svar:
- Kombinera två kolumner och lägg till i en ny kolumn
Angående uppdatering i kommentaren
+
är inte en giltig operator för strängsammansättning i Postgres (eller standard SQL). Det är en privat idé av Microsoft att lägga till detta i sina produkter.
Det finns knappast någon bra anledning att använda (synonym:character(n)
). Använd char(n)
text
eller varchar
. Detaljer:
- Några nackdelar med att använda datatypen "text" för att lagra strängar?
- Bästa sättet att söka efter "tomt eller nullvärde"