Mam dwie kolumny ciągów 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)
.
text
typ?concatenate
że wątpię, czy ma do czynienia z typami numerycznymi, chociaż PostgreSQL zająłby się również niektórymi z nich. Zobacz tutaj: postgresql.org/docs/9.1/static/functions-string.htmlOdpowiedzi:
W przypadku kolumn typu łańcuchowego, takich jak
character(2)
(jak wspomniałeś później), wyświetlona konkatenacja działa tylko dlatego, że cytując instrukcję:Odważne podkreślenie moje. Drugi przykład (
select a||', '||b from foo
) działa dla wszystkich typów danych, ponieważ nietypowy literał ciągu', '
domyślnietext
przyjmuje typ, dzięki czemu całe wyrażenie jest poprawne w każdym przypadku.W przypadku typów danych innych niż łańcuchowe można „naprawić” pierwszą instrukcję, rzutując co najmniej jeden argument na
text
. ( Można rzutować dowolny typtext
):Sądząc po twojej własnej odpowiedzi , „ nie działa ” miało oznaczać „ zwraca NULL ”. Wynikiem wszystkiego połączonego z wartością NULL jest NULL. Jeśli w grę mogą wchodzić wartości NULL, a wynik nie będzie NULL, użyj
concat_ws()
do konkatenacji dowolnej liczby wartości (Postgres 9.1 lub nowszy):Lub
concat()
jeśli nie potrzebujesz separatorów:Nie ma tu potrzeby rzutowania typów, ponieważ obie funkcje pobierają
"any"
dane wejściowe i pracują z reprezentacjami tekstu.Więcej szczegółów (i dlaczego
COALESCE
jest kiepskim substytutem) w tej powiązanej odpowiedzi:Odnośnie aktualizacji w komentarzu
+
nie jest prawidłowym operatorem konkatenacji ciągów znaków w Postgres (lub standardowym SQL). Dodanie tego do swoich produktów jest prywatnym pomysłem firmy Microsoft.Nie ma żadnego powodu, aby używać
(synonim:)character(n)
. Użyjchar(n)
text
lubvarchar
. Detale:źródło
Postgres 9.1 or later
, prawda? Na początek w pytaniu powinieneś podać swoją wersję Postgres . Proszę zaktualizować swoje pytanie ze wszystkich żądanych informacji, zanim wróci do niczego innego.SELECT concat(a, b) FROM foo;
działa dla mnie w Postgres 9.3, kiedya
ib
sąVARCHAR
.Problem polegał na zerach w wartościach; wtedy konkatenacja nie działa z wartościami null. Rozwiązanie jest następujące:
źródło
do konkatenacji lepiej jest użyć funkcji CONCAT w PostgreSQL
np .:
select CONCAT(first_name,last_name) from person where pid = 136
jeśli używasz column_a || '' || kolumna_b do konkatenacji dla 2 kolumn, jeśli którakolwiek z wartości w kolumnie_a lub kolumna_b ma wartość null, zapytanie zwróci wartość null. co może nie być preferowane we wszystkich przypadkach ... więc zamiast tego
posługiwać się
zwróci odpowiednią wartość, jeśli którykolwiek z nich ma wartość
źródło
Funkcje CONCAT czasami nie działają ze starszą wersją PostgreSQL
zobacz, czego użyłem do rozwiązania problemu bez użycia CONCAT
Lub też możesz użyć
w drugim przypadku użyłem podwójnych cudzysłowów dla imienia i nazwiska
Mam nadzieję, że to się przyda, dzięki
źródło
Ponieważ też utknąłem w tym, myślę, że powinienem podzielić się rozwiązaniem, które najlepiej mi pasuje. Myślę też, że jest to znacznie prostsze.
Jeśli używasz nazwy tabeli pisanej wielkimi literami.
Jeśli używasz nazwy tabeli małymi literami
Otóż to!. Ponieważ PGSQL liczy podwójne cudzysłowy dla deklaracji kolumn i pojedyncze cudzysłowy dla ciągu znaków, działa to jak urok.
źródło
Framework PHP Laravel, używam wyszukiwania first_name, last_name Pola traktują jak Full Name Search
Ten zadziałał urok !!!
źródło
Spróbuj tego
źródło
concat_ws(' ', FirstName, LastName)
byłoby znacznie czystsze.Na przykład, jeśli istnieje tabela pracowników, która składa się z kolumn takich jak:
jeśli chcemy połączyć
f_name + l_name
jakoname
.źródło