У стовпцях типу рядка типу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
типу?