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

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, я использую поиск 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);

это сработало очарование!!!

например, если есть таблица employee, которая состоит из столбцов как:

employee_number,f_name,l_name,email_id,phone_number 

если мы хотим обединить f_name + l_name как name.

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;