С колони от тип низ като 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
. Подробности:
- Някакви недостатъци при използването на тип данни „текст“ за съхранение на низове?
- Най-добрият начин да проверите за „празна или нулева стойност“