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 text
membuat 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 COALESCE
pengganti 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 text
atauvarchar
. Detail:
text
tipe lain ?