अगर किसी भी क्षेत्र में NULL होता है, तो MySQL CONCAT रिटर्न देता है


163

मेरी तालिका "डिवाइस" में निम्नलिखित डेटा हैं

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    

मैंने क्वेरी के नीचे निष्पादित किया

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

यह नीचे दिया गया परिणाम देता है

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

इससे बाहर कैसे आना चाहिए ताकि इसे NULL AND परिणाम की अनदेखी करनी चाहिए

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-

जवाबों:


279

NULLरिक्त स्ट्रिंग के साथ मान को इसमें लपेटकर परिवर्तित करेंCOALESCE

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

1
यदि आप CONCAT (अगर (affiliate_name null, '', affiliate_name), '-', if (यदि मॉडल null है, '', affiliate_name) का चयन डिवाइस से मॉडल के रूप में कर सकते हैं
दिनेश राबरा

6
उन आश्चर्य के लिए, जैसा कि मैंने किया था, COALESCEफ़ंक्शन क्या करता है: यह पहला गैर- NULLमान पैरामीटर लौटा देता है जो (या NULLयदि सभी पैरामीटर हैं NULL)। दूसरे पैरामीटर के रूप में एक खाली स्ट्रिंग पास करके, आप गारंटी दे रहे हैं कि यह वापस नहीं आएगा NULL
जो।

3
mysql में IFNULL (arg, default) के बजाय एक ही सिंटैक्स के साथ COALESCE है
Vasilii Suricov

126

इसके बजाय CONCAT_WS का उपयोग करें :

CONCAT_WS () खाली स्ट्रिंग्स को नहीं छोड़ता है। हालाँकि, यह किसी भी NULL मान को विभाजक तर्क के बाद छोड़ता है।

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

क्षमा करें नीरज मुझे कॉनैट और WS के बीच '_' याद है कृपया CONCAT_WS () के साथ फिर से प्रयास करें। मैंने उत्तर को अपडेट किया है कृपया जाँचें,
Gurmeet

8
ध्यान दें कि यह समाधान एक पूर्ण "कॉलम" (विभाजक सहित) को छुपाता है यदि मध्य क्षेत्र में से एक NULL है। तो यह उत्तर केवल यह मानकर सही है कि केवल अंतिम फ़ील्ड ही NULL हो सकती है। आपकी आवश्यकता के आधार पर, नीचे दिया गया COALEASE () उत्तर बेहतर हो सकता है।
Jannes

यह केवल तभी काम करता है जब आप प्रत्येक सदस्य को एक ही विभाजक द्वारा अलग करना चाहते हैं। CONCAT में यह सीमा नहीं है। मैंने उत्तर के रूप में समाधान पोस्ट किया
पैट्रिक

12

CONCAT_WS में CONCAT की तरह ही लचीलापन है (यदि आप उदाहरण के लिए प्रत्येक सदस्य के बीच एक ही विभाजक नहीं चाहते हैं) तो निम्न का उपयोग करें:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)


10

CONCAT_WSअभी भी मेरे लिए अशक्त पैदा करता है यदि पहला क्षेत्र अशक्त है। मैंने शुरुआत में शून्य लंबाई स्ट्रिंग जोड़कर इसे हल किया

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

तथापि

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

पहला क्षेत्र नल है जब अशक्त पैदा करता है।


जाहिर है, क्योंकि पहला क्षेत्र वह स्ट्रिंग है जिसे वह (WS = स्ट्रिंग के साथ)
बोके वेर्स्टिघ

2
CONCAT_WS, सेपरेटनेट विथ सेपरेटर के लिए छोटा है। पहला पैरामीटर विभाजक है और शून्य नहीं हो सकता। यह संभवतः आप के बजाय क्या चाहते हैं:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
एनक्रेस्ट करें

2

यदि आप नीचे दिए गए विवरण का उपयोग कर सकते हैं

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.