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-

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

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

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)

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.