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