Как объединить столбцы в Postgres SELECT?
у меня есть две строки столбцов a
и b
в таблице foo
.
select a, b from foo
возвращает значения a
и b
. Однако, конкатенация a
и b
не работает. Я попробовал:
select a || b from foo
и
select a||', '||b from foo
обновление из комментариев: оба столбца имеют тип character(2)
.
7 ответов:
С строку типа столбцы как
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 значения могут быть задействованы и результат не должен быть нулевым, используйте
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
. Подробности:
проблема была в nulls в значениях; тогда конкатенация не работает с nulls. Решение заключается в следующем:
SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
лучше использовать функцию CONCAT в PostgreSQL для конкатенации
например :
select CONCAT(first_name,last_name) from person where pid = 136
Если вы используете column_a | | '' / / column_b для конкатенации для 2 столбца , если любое значение в column_a или column_b равно null, запрос вернет значение null. что может быть предпочтительным не во всех случаях.. так что вместо этого
|/
использовать
CONCAT
он вернет соответствующие значение, если любой из них имеет значение
функции CONCAT иногда не работают со старой версией postgreSQL
смотрите, что я использовал для решения проблемы без использования CONCAT
u.first_name || ' ' || u.last_name as user,
или также вы можете использовать
"first_name" || ' ' || "last_name" as user,
во втором случае я использовал двойные кавычки для first_name и last_name
надеюсь, это будет полезно, спасибо
фреймворк PHP Laravel, я использую поиск first_name, last_name поля рассмотрим как полное имя Search
используя / / symbol или concat_ws (), concat () методы
$names = str_replace(" ", "", $searchKey); $customers = Customer::where('organization_id',$this->user->organization_id) ->where(function ($q) use ($searchKey, $names) { $q->orWhere('phone_number', 'ilike', "%{$searchKey}%"); $q->orWhere('email', 'ilike', "%{$searchKey}%"); $q->orWhereRaw('(first_name || last_name) LIKE ? ', '%' . $names. '%'); })->orderBy('created_at','desc')->paginate(20);
это сработало очарование!!!