İle dize türü gibi sütunlarda character(2)
(daha sonra belirtildiği gibi), görüntülenen birleştirme sadece çünkü işleri manuel alıntı:
[...] dize birleştirme operatörü ( ||
) , Tablo 9.8'de gösterildiği
gibi en az bir girdi bir dize türünde olduğu sürece dize dışı girişi kabul eder . Diğer durumlar için, [...]text
Cesur vurgu benim. İkinci örnek ( select a||', '||b from foo
) herhangi bir veri türü için çalışır, çünkü türlenmemiş dize değişmez değeri ', '
varsayılan olarak text
tüm ifadeyi geçerli kılmak için yazmayı varsayılan olarak kullanır .
Dize olmayan veri türleri için, en az bir bağımsız değişken yayınlayarak 1. ifadeyi "düzeltebilirsiniz" text
. ( Herhangi bir tür dökülebilir text
):
SELECT a::text || b AS ab FROM foo;
Kendi cevabınızdan yola çıkarak " işe yaramaz " ifadesinin " NULL döndürmesi " anlamına gelmesi gerekiyordu . NULL ile bitiştirilen herhangi bir şeyin sonucu NULL olur. Eğer NULL değerler dahil olabilir ve sonuç geçersiz olmayacaktır, kullanım concat_ws()
değerleri (daha sonra Postgres 9.1 ya da) herhangi bir sayıda bitiştirmek için:
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Veya concat()
ayırıcılara ihtiyacınız yoksa:
SELECT concat(a, b) AS ab FROM foo;
Her iki işlev de "any"
girdi aldığından ve metin gösterimleriyle çalıştığından burada tür yayınlarına gerek yoktur .
COALESCE
Bu ilgili yanıtta daha fazla ayrıntı (ve neden kötü bir ikame edicidir):
İçinde güncellemeyi İlişkin Yorumlarınız
+
Postgres'de (veya standart SQL'de) dize birleştirmesi için geçerli bir operatör değil. Bunu ürünlerine eklemek Microsoft'un özel bir fikri.
Kullanmak için neredeyse hiç iyi bir neden yoktur character(n)
(eşanlamlı:) char(n)
. text
Veyavarchar
tuşunu kullanın . Detaylar:
text
tip?