У меня есть два строковых столбца a
и b
в таблице foo
.
select a, b from foo
возвращает значения a
и b
. Однако конкатенация a
и b
не работает. Я попытался :
select a || b from foo
и
select a||', '||b from foo
Обновление из комментариев: оба столбца являются типом character(2)
.
text
тип?concatenate
я сомневаюсь, что он имеет дело с числовыми типами, хотя PostgreSQL позаботится и о некоторых из них. Смотрите здесь: postgresql.org/docs/9.1/static/functions-string.htmlОтветы:
С такими столбцами строкового типа, как
character(2)
(как вы упоминали позже), отображаемая конкатенация работает, потому что, цитируя руководство:Жирный акцент мой. 2-й пример (
select a||', '||b from foo
) работает для любых типов данных, так как нетипизированный строковый литерал по', '
умолчанию набирает тип,text
делая все выражение действительным в любом случае.Для нестроковых типов данных вы можете «исправить» 1-й оператор, приведя хотя бы один аргумент к
text
. ( Любой тип может быть приведен кtext
):Судя по вашему собственному ответу , « не работает » должно было означать « возвращает NULL ». Результатом всего, что связано с NULL, является NULL. Если могут использоваться значения NULL и результат не должен быть NULL, используйте
concat_ws()
для объединения любого числа значений (Postgres 9.1 или более поздняя версия):Или,
concat()
если вам не нужны разделители:Здесь нет необходимости в приведении типов, поскольку обе функции принимают
"any"
ввод и работают с текстовыми представлениями.Более подробно (и почему
COALESCE
это плохая замена) в этом связанном ответе:По поводу обновления в комментарии
+
не является допустимым оператором для конкатенации строк в Postgres (или стандартном SQL). Это частная идея Microsoft - добавить это в свои продукты.Вряд ли есть веская причина для использования
(синоним:)character(n)
. Используйтеchar(n)
text
илиvarchar
. Подробности:источник
Postgres 9.1 or later
, верно? Вы должны были предоставить свою версию Postgres для начала, в вопросе . Пожалуйста, обновите ваш вопрос со всей запрашиваемой информацией, прежде чем вернуться к чему-либо еще.SELECT concat(a, b) FROM foo;
у меня работает в Postgres 9.3 когдаa
иb
естьVARCHAR
с.Проблема была в нулях в значениях; тогда конкатенация не работает с нулями. Решение заключается в следующем:
источник
для конкатенации лучше использовать функцию CONCAT в PostgreSQL
например:
select CONCAT(first_name,last_name) from person where pid = 136
если вы используете column_a || '' || column_b для конкатенации для 2-х столбцов, если любое из значений в column_a или column_b равно нулю, запрос вернет нулевое значение. что не может быть предпочтительным во всех случаях .. поэтому вместо этого
использование
он вернет соответствующее значение, если любой из них имеет значение
источник
Функции CONCAT иногда не работают со старой версией postgreSQL
посмотрите, что я использовал для решения проблемы без использования CONCAT
Или также вы можете использовать
во втором случае я использовал двойные кавычки для имени и фамилии
Надеюсь, это будет полезно, спасибо
источник
Поскольку я также застрял в этом, думаю, что я должен поделиться решением, которое работало лучше всего для меня. Я также думаю, что это намного проще.
Если вы используете имя заглавной таблицы.
Если вы используете имя таблицы в нижнем регистре
Это оно!. Поскольку PGSQL считает двойную кавычку для объявления столбца и одинарную кавычку для строки, это работает как шарм.
источник
PHP каркас Laravel, я использую поиск first_name, last_name Поля считают похожими на поиск полного имени
Это сработало очарование !!!
источник
Попробуй это
источник
concat_ws(' ', FirstName, LastName)
будет намного чище.Например, если есть таблица сотрудников, которая состоит из столбцов в виде:
если мы хотим объединить
f_name + l_name
какname
.источник