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

надеюсь, это будет полезно, спасибо


попробуй такое

select textcat(textcat(FirstName,' '),LastName) AS Name from person;

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;