İ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 texttü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 .
COALESCEBu 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). textVeyavarchar tuşunu kullanın . Detaylar:
texttip?