Se sloupci typu řetězce jako character(2)
(jak jste uvedl později), zobrazené zřetězení prostě funguje, protože, cituji manuál:
[...] operátor zřetězení řetězců (
||
) přijímá neřetězcový vstup, pokud alespoň jeden vstup je řetězcového typu , jak je uvedeno v tabulce 9.8. V ostatních případech vložte dotext
explicitní donucení [...]
Odvážný důraz můj. 2. příklad (select a||', '||b from foo
) funguje pro jakékoli datové typy od netypového řetězcového literálu ', '
výchozí typ text
takže celý výraz bude v každém případě platný.
U neřetězcových datových typů můžete „opravit“ 1. příkaz přetypováním alespoň jednoho argumentu do text
. (Jakékoli typ lze přetypovat na text
):
SELECT a::text || b AS ab FROM foo;
Soudě podle vaší vlastní odpovědi:„nefunguje " měl znamenat "vrací NULL ". Výsledek cokoli." zřetězený na NULL je NULL. Pokud NULL hodnoty mohou být zahrnuty a výsledek nesmí být NULL, použijte concat_ws()
ke zřetězení libovolného počtu hodnot (Postgres 9.1 nebo novější):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Oddělovače se přidávají pouze mezi nenulové hodnoty, tj. pouze tam, kde je to nutné.
Nebo concat()
pokud nepotřebujete oddělovače:
SELECT concat(a, b) AS ab FROM foo;
Zde není potřeba přetypování, protože obě funkce berou "any"
vkládání a práce s textovými reprezentacemi.
Další podrobnosti (a proč COALESCE
je špatná náhrada) v této související odpovědi:
- Zkombinujte dva sloupce a přidejte je do jednoho nového sloupce
O aktualizaci v komentáři
+
není platný operátor pro zřetězení řetězců v Postgres (nebo standardní SQL). Je to soukromý nápad společnosti Microsoft přidat toto do svých produktů.
Pro použití (synonymum:character(n)
neexistuje žádný dobrý důvod ). Použijte char(n)
text
nebo varchar
. Podrobnosti:
- Nějaké nevýhody používání datového typu "text" pro ukládání řetězců?
- Nejlepší způsob, jak zkontrolovat „prázdnou nebo nulovou hodnotu“