Z kolumnami typu string, takimi jak character(2)
(jak wspomniałeś później), wyświetlana konkatenacja działa tylko dlatego, że cytując instrukcję:
[...] operator konkatenacji ciągów (||
) akceptuje dane inne niż ciąg, o ile co najmniej jedno wejście jest typu ciąg , jak pokazano w tabeli 9.8. W innych przypadkach wstaw wyraźny przymus do text
[...]
Moje odważne podkreślenie. Drugi przykład (select a||', '||b from foo
) działa dla dowolnego typy danych, ponieważ nieopisany literał ciągu ', '
domyślnie wpisz text
czyniąc całe wyrażenie ważnym w każdym przypadku.
W przypadku typów danych innych niż łańcuchowe możesz „naprawić” pierwszą instrukcję, rzutując co najmniej jeden argument na text
. (Dowolny typ można rzutować na text
):
SELECT a::text || b AS ab FROM foo;
Sądząc po Twojej odpowiedzi, „nie działa „ miało oznaczać „zwraca NULL „. Wynik cokolwiek w połączeniu z NULL ma wartość NULL. Jeśli NULL wartości mogą być zaangażowane, a wynik nie może być NULL, użyj concat_ws()
do łączenia dowolnej liczby wartości (Postgres 9.1 lub nowszy):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Separatory są dodawane tylko między wartościami innymi niż null, tj. tylko tam, gdzie jest to konieczne.
Lub concat()
jeśli nie potrzebujesz separatorów:
SELECT concat(a, b) AS ab FROM foo;
Nie ma potrzeby rzutowania typów tutaj, ponieważ obie funkcje przyjmują "any"
wprowadzanie i praca z reprezentacjami tekstowymi.
Więcej szczegółów (i dlaczego COALESCE
jest kiepskim substytutem) w tej powiązanej odpowiedzi:
- Połącz dwie kolumny i dodaj do jednej nowej kolumny
Jeśli chodzi o aktualizację w komentarzu
+
nie jest prawidłowym operatorem konkatenacji ciągów w Postgresie (lub standardowym SQL). To prywatny pomysł firmy Microsoft, aby dodać to do swoich produktów.
Nie ma prawie żadnego dobrego powodu, aby używać (synonim:character(n)
). Użyj char(n)
text
lub varchar
. Szczegóły:
- Jakieś wady używania typu danych „tekst” do przechowywania ciągów?
- Najlepszy sposób na sprawdzenie „pustej lub pustej wartości”