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ę:
[...] operator konkatenacji łańcuchów ( ||
) akceptuje dane wejściowe niebędące łańcuchami, o ile przynajmniej jedno wejście jest typu łańcuchowego , jak pokazano w
tabeli 9.8 . W innych przypadkach wstaw wyraźny przymus text
[...]
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ślnie text
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 typ text
):
SELECT a::text || b AS ab FROM foo;
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):
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 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ć character(n)
(synonim:) char(n)
. Użyj text
lubvarchar
. Detale:
text
typ?