Jak połączyć kolumny w Postgres SELECT?

Mam dwie kolumny string a i b w tabeli foo.

select a, b from foo zwraca wartości a i b. Jednak konkatenacja a i b nie działa. Próbowałem:

select a || b from foo

I

select  a||', '||b from foo

Aktualizacja z komentarzy: obie kolumny są typu character(2).

Author: Erwin Brandstetter, 2013-11-13

7 answers

Z string type kolumny jak character(2) (Jak wspomniałeś później), wyświetlana konkatenacja działa tylko dlatego, że cytując instrukcję:

[...] Operator concatenation string (||) akceptuje Nie-string wejście, o ile przynajmniej jedno wejście jest typu string , Jak pokazano w tabela 9.8 . W innych przypadkach należy wstawić wyraźny przymus do text [...]

/ Align = "left" / Drugi przykład (select a||', '||b from foo) działa dla dowolne typy danych od nietypowanego ciągu znaków literal ', ' domyślnie typ text czyniący całe wyrażenie poprawnym w każdym przypadku.

Dla nie-ciągowych typów danych, można" naprawić " pierwszą instrukcję przez oddanie co najmniej jednego argumentu do text. (dowolny typ można oddać do text):

SELECT a::text || b AS ab FROM foo;

Sądząc po twoja własna odpowiedź, "nie działa "miało oznaczać" zwraca NULL". Wynik czegokolwiek połączonego z NULL to NULL. Jeśli NULL można zastosować wartości, a wynik nie może być NULL, użyj concat_ws() aby połączyć dowolną liczbę wartości (Postgres 9.1 lub nowszy):

SELECT concat_ws(', ', a, b) AS ab FROM foo;

Lub concat() jeśli nie potrzebujesz separatorów:

SELECT concat(a, b) AS ab FROM foo;

Nie ma tu potrzeby typowania, ponieważ obie funkcje przyjmują "any" wprowadzanie i praca z reprezentacjami tekstowymi.

Więcej szczegółów (i dlaczego COALESCE jest słabym substytutem) w tym pokrewnym odpowiedź:

Odnośnie aktualizacji w komentarzu

+ nie jest poprawnym operatorem dla konkatenacji łańcuchów w Postgres (lub w standardzie SQL). To prywatny pomysł Microsoftu, aby dodać to do swoich produktów.

Nie ma prawie żadnego dobrego powodu, aby używać character(n) (synonim: char(n)). Użycie text lub varchar. Szczegóły:

 187
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 01:55:49

Problem był w Null w wartościach; wtedy konkatenacja nie działa z NULL. Rozwiązanie jest następujące:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
 19
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-20 22:44:04

Lepiej jest użyć funkcji CONCAT w PostgreSQL do konkatenacji

Eg: select CONCAT(first_name,last_name) from person where pid = 136

Jeśli używasz column_a | / '' / / column_b do konkatenacji dla 2 kolumn, jeśli którakolwiek z wartości w column_a lub column_b jest null zapytanie zwróci wartość null. które nie mogą być preferowane we wszystkich przypadkach.. więc zamiast tego

||

Użyj

CONCAT

Zwróci odpowiednią wartość, jeśli któryś z nich ma wartość

 14
Author: arjun nagathankandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 09:36:14

Funkcje CONCAT czasami nie działają ze starszą wersją postgreSQL

Zobacz, czego użyłem do rozwiązania problemu bez użycia CONCAT

 u.first_name || ' ' || u.last_name as user,

Lub też możesz użyć

 "first_name" || ' ' || "last_name" as user,

W drugim przypadku użyłem podwójnych cudzysłowów dla first_name i last_name

Mam nadzieję, że będzie to przydatne, dzięki

 3
Author: Rameshwar Vyevhare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 06:47:40

Spróbuj tego

select textcat(textcat(FirstName,' '),LastName) AS Name from person;
 0
Author: Muhammad Sadiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 10:14:43

PHP ' s Laravel framework, używam wyszukiwania first_name, pola last_name traktują jako Wyszukiwanie pełnej nazwy

Użycie / / symbol lub metody 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);
To zadziałało!!!
 0
Author: venkatSkpi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 08:17:47

Na przykład, jeśli istnieje tabela pracowników, która składa się z kolumn jako:

employee_number,f_name,l_name,email_id,phone_number 

Jeśli chcemy połączyć f_name + l_name jako name.

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;
 -3
Author: Abhishek Mitra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-13 15:30:15