Dengan kolom tipe string seperti character(2)(seperti yang Anda sebutkan nanti), rangkaian yang ditampilkan hanya berfungsi karena, mengutip manual:
[...] operator penggabung string ( ||) menerima input non-string, selama setidaknya satu input dari tipe string , seperti yang ditunjukkan pada
Tabel 9.8 . Untuk kasus lain, masukkan paksaan eksplisit ke text[...]
Penekanan berani saya. Contoh ke-2 ( select a||', '||b from foo) berfungsi untuk semua tipe data karena string literal yang tidak diketik ', 'default untuk mengetik textmembuat seluruh ekspresi valid dalam kasus apa pun.
Untuk tipe data non-string, Anda dapat "memperbaiki" pernyataan pertama dengan melemparkan setidaknya satu argumen text. ( Semua jenis dapat dilemparkan ke text):
SELECT a::text || b AS ab FROM foo;
Menilai dari jawaban Anda sendiri , " tidak berfungsi " seharusnya berarti " mengembalikan NULL ". Hasil dari apa pun yang digabungkan ke NULL adalah NULL. Jika nilai NULL dapat terlibat dan hasilnya tidak boleh NULL, gunakan concat_ws()untuk menggabungkan sejumlah nilai (Postgres 9.1 atau lebih baru):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Atau concat()jika Anda tidak membutuhkan pemisah:
SELECT concat(a, b) AS ab FROM foo;
Tidak perlu mengetikkan cor di sini karena kedua fungsi mengambil "any"input dan bekerja dengan representasi teks.
Detail lebih lanjut (dan mengapa COALESCEpengganti yang buruk) dalam jawaban terkait ini:
Mengenai pembaruan dalam komentar
+bukan operator yang valid untuk penggabungan string dalam Postgres (atau SQL standar). Ini adalah ide pribadi Microsoft untuk menambahkan ini ke produk mereka.
Nyaris tidak ada alasan untuk menggunakan character(n)(sinonim:) char(n). Gunakan textatauvarchar . Detail:
texttipe lain ?