С такими столбцами строкового типа, как 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тип?