Как объединить столбцы в 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 framework, я использую search first_name, last_name поля рассматривают как поиск полного имени
использование / / 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);
это сработало очарование!!!
например, если есть таблица employee, которая состоит из столбцов как:
employee_number,f_name,l_name,email_id,phone_number
если мы хотим обединить f_name + l_name
as name
.
SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;