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)
.
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ę:
/ Align = "left" / Drugi przykład ([...] 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 dotext
[...]
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ć (synonim: character(n)
). Użycie char(n)
text
lub varchar
. Szczegóły:
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;
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ść
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
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;
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!!!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;
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