С колони от тип низ като character(2) (както споменахте по-късно), показаната конкатенация просто работи, защото цитирайки ръководството:
[...] операторът за конкатенация на низове (
||) приема въвеждане без низ, стига поне един вход е от тип низ , както е показано в Таблица 9.8. В други случаи вмъкнете изрична принуда къмtext[...]
Удебелен акцент мой. Вторият пример (select a||', '||b from foo ) работи за всяко типове данни, тъй като невписаният низов литерал ', ' по подразбиране въвежда text прави целия израз валиден във всеки случай.
За типове данни, които не са низови, можете да "поправите" 1-вия израз, като пуснете поне един аргумент към text . (Всяко типът може да бъде прехвърлен към text ):
SELECT a::text || b AS ab FROM foo;
Съдейки по вашия собствен отговор, „не работи „ трябваше да означава „връща NULL ". Резултатът от всичко свързано с NULL е NULL. Ако NULL могат да бъдат включени стойности и резултатът не трябва да е NULL, използвайте concat_ws() за конкатениране на произволен брой стойности (Postgres 9.1 или по-нова версия):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Разделители се добавят само между ненулеви стойности, т.е. само когато е необходимо.
Или concat() ако не се нуждаете от разделители:
SELECT concat(a, b) AS ab FROM foo;
Тук няма нужда от привеждане на типа, тъй като и двете функции приемат "any" въвеждане и работа с текстови представяния.
Повече подробности (и защо COALESCE е лош заместител) в този свързан отговор:
- Комбинирайте две колони и добавете в една нова колона
Относно актуализацията в коментар
+ не е валиден оператор за конкатенация на низове в Postgres (или стандартен SQL). Частна идея на Microsoft е да добави това към своите продукти.
Едва ли има основателна причина да използвате (синоним:character(n) ). Използвайте char(n) text или varchar . Подробности:
- Някакви недостатъци при използването на тип данни „текст“ за съхранение на низове?
- Най-добрият начин да проверите за „празна или нулева стойност“