MySQL CONCAT mengembalikan NULL jika bidang apa pun berisi NULL

163

Saya memiliki data berikut di "perangkat" tabel saya

affiliate_name  affiliate_location  model     ip             os_type    os_version 

cs1             inter               Dell     10.125.103.25   Linux      Fedora  
cs2             inter               Dell     10.125.103.26   Linux      Fedora  
cs3             inter               Dell     10.125.103.27   NULL       NULL    
cs4             inter               Dell     10.125.103.28   NULL       NULL    

Saya mengeksekusi query di bawah ini

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name
FROM devices

Ini mengembalikan hasil yang diberikan di bawah ini

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
(NULL)
(NULL)

Bagaimana keluar dari ini sehingga harus mengabaikan NULL DAN hasilnya seharusnya

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
cs3-Dell-10.125.103.27-
cs4-Dell-10.125.103.28-
neeraj
sumber

Jawaban:

280

konversi NULLnilai dengan string kosong dengan membungkusnyaCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
John Woo
sumber
1
Anda dapat menggunakan jika memilih CONCAT (if (affiliate_name is null, '', affiliate_name), '-', if (model null, '', affiliate_name)) sebagai model dari perangkat
Dinesh Rabara
6
Bagi mereka yang bertanya-tanya, seperti yang saya lakukan, apa COALESCEfungsinya: mengembalikan NULLparameter non- nilai pertama yang diteruskan (atau NULLjika semua parameter NULL). Dengan melewatkan string kosong sebagai parameter kedua, Anda menjamin itu tidak akan kembali NULL.
Jo.
3
mysql memiliki IFNULL (arg, default) sebagai gantinya COALESCE dengan sintaks yang sama
Vasilii Suricov
126

Gunakan CONCAT_WS sebagai gantinya:

CONCAT_WS () tidak melewatkan string kosong. Namun, ia melewatkan nilai NULL setelah argumen pemisah.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
Gurmeet
sumber
Maaf neeraj saya melewatkan '_' antara Concat dan WS Silakan coba lagi dengan CONCAT_WS (). Saya telah memperbarui jawabannya, silakan cek,
Gurmeet
8
Perhatikan bahwa solusi ini menyembunyikan "kolom" lengkap (termasuk pemisah) jika salah satu bidang tengah adalah NULL. Jadi jawaban ini hanya benar dengan asumsi bahwa hanya bidang terakhir yang bisa NULL. Bergantung pada kebutuhan Anda, jawaban COALEASE () di bawah ini mungkin lebih baik.
Jannes
Ini hanya berfungsi jika Anda ingin setiap anggota dipisahkan oleh pemisah yang sama. CONCAT tidak memiliki batasan ini. Saya memposting solusinya sebagai jawaban di sini
patrick
12

Untuk memiliki fleksibilitas yang sama dalam CONCAT_WS seperti pada CONCAT (jika Anda tidak ingin pemisah yang sama antara setiap anggota misalnya) gunakan yang berikut ini:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
patrick
sumber
11
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
Harshil
sumber
15
di mysql IFNULL () bukannya ISNULL ()
Jeffrey Nicholson Carré
11

CONCAT_WSmasih menghasilkan null untuk saya jika bidang pertama adalah Null. Saya memecahkan ini dengan menambahkan string panjang nol di awal seperti pada

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

namun

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

menghasilkan Null ketika bidang pertama adalah Null.

Ken4Edge
sumber
jelas, karena bidang pertama adalah string yang akan digabungkan dengan (WS = dengan string)
Bouke Versteegh
2
CONCAT_WS adalah kependekan dari Concatenate With Separator. Parameter pertama adalah pemisah dan tidak boleh nol. Ini mungkin yang Anda inginkan sebagai gantinya:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest
2

Anda bisa menggunakan statement if seperti di bawah ini

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Dinesh Rabara
sumber