У стовпцях типу рядка типуcharacter(2) (як ви згадували пізніше) відображене конкатенація просто працює, оскільки, цитуючи посібник:
[...] оператор конкатенації рядків ( ||) приймає нестроковий вхід, якщо принаймні один вхід має рядковий тип , як показано в
таблиці 9.8 . Для інших випадків введіть явний примус до text[...]
Сміливий акцент мій. 2-й приклад ( 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 . Деталі:
textтипу?