2011-10-13 11 views
17

कोड के नीचे दिए गए हिस्से में, मैं पते के विभिन्न हिस्सों को जोड़कर एक पता फ़ील्ड बना रहा हूं।संभावित नल या खाली मूल्यों के साथ सशर्त CONCAT

हालांकि, उदाहरण के लिए address2 खाली था, पिछला , अभी भी पते में सम्मिलित होगा।

इसका मतलब है कि यदि सभी फ़ील्ड खाली हैं, तो मैं ,,,, के परिणामस्वरूप समाप्त होता हूं।

यदि address1"House Number" है और बाकी सब कुछ खाली है, तो मैं House Number,,,, के साथ समाप्त होता हूं।

CONCAT(COALESCE(address1,'') , ', ' , 
     COALESCE(address2,'') , ', ' , 
     COALESCE(address3,'') , ', ' , 
     COALESCE(city,'')  , ', ' , 
     COALESCE(zip, '') 
) AS Address, 

क्या पता भाग के बीच कॉमा को सशर्त रूप से रखने का कोई तरीका है यदि पता भाग की सामग्री खाली नहीं है।

(छद्म कोड) IF(address1) is NULL use '' ELSE use ','

धन्यवाद की तर्ज पर कुछ के रूप में इस तरह के।

उत्तर

24

CONCAT_WS फ़ंक्शन पर एक नज़र डालें। यह वही करता है जो आप चाहते हैं।

+0

धन्यवाद, यह वही है जो मुझे चाहिए। – Houdmont

+0

दस्तावेज़ों के लिए लिंक होना अच्छा लगा। – bloodyKnuckles

3

CONCAT_WS का उपयोग करते हुए चटाई का कहना है एक बहुत अच्छा विचार है के रूप में है, लेकिन मैंने सोचा कि मैं यह एक अलग तरह से करना चाहते हैं, गंदा IF() बयानों के साथ:

CONCAT(COALESCE(address1,''), IF(LENGTH(address1), ', ', ''), 
     COALESCE(address2,''), IF(LENGTH(address2), ', ', ''), 
     COALESCE(address3,''), IF(LENGTH(address3), ', ', ''), 
     COALESCE(city,''), IF(LENGTH(city), ', ', ''), 
     COALESCE(zip,''), IF(LENGTH(address1), ', ', ''), 
) AS Address, 

IF() s चेक अगर क्षेत्र लंबाई है और यदि ऐसा है तो एक अल्पविराम लौटाता है। अन्यथा, यह एक खाली स्ट्रिंग देता है।

+0

सुझाव के लिए धन्यवाद, यह ठीक काम करता है, लेकिन जैसा कि आप इंगित करते हैं, CONCAT_WS का उपयोग करना भी आसान है इसलिए मैं इसके साथ अटक गया हूं। – Houdmont

26
CONCAT_WS(', ', 
     IF(LENGTH(`address1`),`address1`,NULL), 
     IF(LENGTH(`address2`),`address2`,NULL), 
     IF(LENGTH(`address3`),`address3`,NULL), 
     IF(LENGTH(`city`),`city`,NULL), 
     IF(LENGTH(`zip`),`zip`,NULL) 
) 
+1

यह समाधान सुरुचिपूर्ण है। NULL को वापस करने के लिए LENGTH फ़ंक्शन का उपयोग, जो उस स्थिति को सुदृढ़ रूप से संभालता है जहां एक खाली स्ट्रिंग मौजूद है।एक खाली स्ट्रिंग न्यूल नहीं है, इसलिए concat_ws गलत स्ट्रिंग्स से पहले एक डिलीमीटर को गलत तरीके से शामिल कर देगा। बहुत अच्छा! – kd4ttc

+1

और एक उपयोगकर्ता @ मार्टिन से जिन्होंने केवल 11 प्रतिष्ठा बिंदुओं के साथ स्टैक ओवरफ्लो पर एक प्रश्न का उत्तर दिया है। मैं नम्र हूँ। – kd4ttc

+0

बहुत बहुत धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। बहुत समय बचाया – Saurabh

3

MAKE_SET

SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address 

यह होगा के साथ प्रयास करें ,

4

द्वारा अलग सब नहीं NULL मूल्य के साथ एक स्ट्रिंग रिटर्न के रूप में यहाँ उत्तर दिया: How to concat_ws multiple fields and remove duplicate separators for empty slots

इस रूप में रिक्त स्ट्रिंग बाहर साफ हो जाएगा अच्छी तरह से मूल्यों के रूप में अच्छी तरह से।

CONCAT_WS(", ", NULLIF(address1, ""), NULLIF(address2, ""), NULLIF(address3, ""), NULLIF(city, ""), NULLIF(zip, "")) 
0

के रूप में यह स्पष्ट रूप से doc कि में बताया गया है:

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

हम शून्य जो सुंदर ढंग से CONCAT_WS द्वारा नियंत्रित किया जाता द्वारा खाली स्थान निकाल सकते हैं।

CONCAT_WS(', ', 
     IF(`address1` != '', `address1`, NULL), 
     IF(`address2` != '', `address2`, NULL), 
     IF(`address3` != '', `address3`, NULL), 
     IF(`city` != '', `city, NULL), 
     IF(`zip` != '', `zip, NULL) 
) 
संबंधित मुद्दे