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 textprzyjmuje 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 COALESCEjest 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 textlubvarchar . Detale:
texttyp?