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 dotextexplicitní 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“