Herhangi bir alan NULL içeriyorsa MySQL CONCAT NULL döndürür


163

"Cihazlarım" tablomda aşağıdaki veriler var

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    

Sorgu altında yürüttüm

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

Aşağıda verilen sonucu döndürür

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

Bundan nasıl çıkılır ki NULL'u görmezden gelmeli ve sonuç olmalı

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-

Yanıtlar:


279

NULLdeğerleri içine boş bir dize ile dönüştürerekCOALESCE

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

1
Aygıtlardan model olarak CONCAT (eğer (
bağlı_isim_adı

6
Bu merak için, yaptığım gibi, COALESCEişlev ne yapar: kendisine NULLgeçirilen ilk değer olmayan parametreyi döndürür (veya NULLtüm parametreler varsa NULL). İkinci parametre olarak boş bir dize ileterek, geri dönmeyeceğini garanti edersiniz NULL.
Jo.

3
mysql, aynı sözdizimiyle COALESCE yerine IFNULL (arg, default) var
Vasilii Suricov

126

Kullanım CONCAT_WS yerine:

CONCAT_WS () boş dizeleri atlamıyor. Ancak, ayırıcı bağımsız değişkeninden sonra NULL değerleri atlar.

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

Maalesef i CONCAT arasında '_' cevapsız ve WS CONCAT_WS () ile tekrar deneyin Cevabın kontrol ediniz güncelledik, shanky.
GURMEET

8
Orta alanlardan biri NULL ise, bu çözümün tam bir "sütun" (ayırıcı dahil) gizlediğini unutmayın. Bu nedenle, yalnızca son alanların NULL olabileceği varsayılarak bu cevap doğrudur. İhtiyacınıza bağlı olarak, aşağıdaki COALEASE () yanıtı daha iyi olabilir.
Jannes'in

Bu yalnızca her üyenin aynı ayırıcıyla ayrılmasını istiyorsanız çalışır. CONCAT'in bu sınırlaması yoktur. Çözümü burada bir cevap olarak gönderdim
patrick

12

CONCAT ile aynı esnekliğe sahip olmak için (örneğin her üye arasında aynı ayırıcı istemiyorsanız) aşağıdakileri kullanın:

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
ISNULL () yerine mysql IFNULL ()
Jeffrey Nicholson Carré

11

CONCAT_WSilk alan Null ise yine de benim için null üretir. Başında olduğu gibi sıfır uzunluklu bir dize ekleyerek bunu çözdüm

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

ancak

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

ilk alan Null olduğunda Null üretir.


Açıkçası, ilk alan birleştireceği dize olduğu için (WS = dize ile)
Bouke Versteegh

2
CONCAT_WS, Ayırıcıyla Birleştir'in kısaltmasıdır. İlk parametre ayırıcıdır ve boş olamaz. Muhtemelen bunun yerine istediğiniz şey:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
15'i

2

aşağıdaki gibi if ifadesini kullanabilirsiniz

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.