Как объединить столбцы в 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;