Dengan kolom tipe string seperti character(2)
(seperti yang Anda sebutkan nanti), rangkaian yang ditampilkan hanya berfungsi karena, mengutip manual:
[...] operator rangkaian string (
||
) menerima input non-string, selama setidaknya satu input bertipe string , seperti yang ditunjukkan pada Tabel 9.8. Untuk kasus lain, masukkan paksaan eksplisit ketext
[...]
Penekanan saya yang berani. Contoh ke-2 (select a||', '||b from foo
) bekerja untuk apa saja tipe data sejak string yang tidak diketik literal ', '
default untuk mengetik text
membuat seluruh ekspresi valid dalam hal apa pun.
Untuk tipe data non-string, Anda dapat "memperbaiki" pernyataan pertama dengan memberikan setidaknya satu argumen ke text
. (Apa saja jenis dapat dilemparkan ke text
):
SELECT a::text || b AS ab FROM foo;
Dilihat dari jawaban Anda sendiri, "tidak berfungsi " seharusnya berarti "mengembalikan NULL ". Hasil dari apa saja digabungkan ke NULL adalah NULL. Jika NULL nilai dapat dilibatkan 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;
Pemisah hanya ditambahkan di antara nilai bukan nol, yaitu hanya jika diperlukan.
Atau concat()
jika Anda tidak membutuhkan pemisah:
SELECT concat(a, b) AS ab FROM foo;
Tidak perlu gips tipe di sini karena kedua fungsi mengambil "any"
masukan dan bekerja dengan representasi teks.
Detail lebih lanjut (dan mengapa COALESCE
adalah pengganti yang buruk) dalam jawaban terkait ini:
- Gabungkan dua kolom dan tambahkan menjadi satu kolom baru
Mengenai pembaruan di komentar
+
bukan operator yang valid untuk penggabungan string di Postgres (atau SQL standar). Ini adalah ide pribadi Microsoft untuk menambahkan ini ke produk mereka.
Hampir tidak ada alasan bagus untuk menggunakan (sinonim:character(n)
). Gunakan char(n)
text
atau varchar
. Detail:
- Apakah ada kerugian menggunakan tipe data "teks" untuk menyimpan string?
- Cara terbaik untuk memeriksa "nilai kosong atau nol"