2011-02-10 15 views
8

यदि एक चयन कथन में मैं एक समेकित स्ट्रिंग का चयन कर रहा हूं जो कि मैं जिस तालिका से चयन कर रहा हूं उससे मूल्यों का उपयोग करता हूं, NULL को संभालने का सबसे अच्छा तरीका क्या है उन मूल्यों के लिए ताकि मेरे पास अभी भी मेरी स्ट्रिंग हो? के रूप में, अगर मैं एक उपयोगकर्ता के लिए शहर, राज्य, और देश का चयन कर रहा हूँ, और मैं एक तिहाई क्षेत्र है कि उन सब को संयोजित करता हैं:टी-एसक्यूएल: स्ट्रिंग कॉन्सटेनेशन में नल मानों को संभालने का सबसे अच्छा तरीका

SELECT City, State, Country, 
City + ', ' + State + ', ' + Country AS 'Location' 
FROM Users 

हालांकि, 'स्थान' शून्य है अगर तीन क्षेत्रों में से किसी है न्यूल (जो तब भी होता है जब उपयोगकर्ता यूएस से नहीं होता)।

SELECT City, State, Country, 
City + ', ' + COALESCE(State + ', ', '') + Country AS 'Location' 
FROM Users 

लेकिन मुझे यकीन है कि अगर यह सिर्फ एक हैक था नहीं था और अगर वहाँ यह करने के लिए एक बेहतर तरीका है:

मेरे वर्तमान समाधान यह है। विचार?

+2

'coalesce' इस के लिए एक मानक अभ्यास है। आपके मामले में आपको केवल 'isnull' की आवश्यकता होगी। [एनएलएल के साथ एसक्यूएल सर्वर स्ट्रिंग कंसटेनेशन] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2916791/sql-server-string-concatenation-with-null) btw – bzlm

+0

@bzlm ओह! आप सही हे। निश्चित नहीं है कि जब मैंने शीर्षक खोजा या दर्ज किया तो यह क्यों नहीं हुआ। शायद क्योंकि मैं विशेष रूप से "टी-एसक्यूएल" डालता हूं। बंद करने के लिए वोटिंग। अपना खुद का प्रश्न बंद करने के लिए मतदान करना हमेशा थोड़ा अजीब होता है। इससे गुदगुदी होती है। – JoeCool

+0

@bzlm "डुप्लिकेट" प्रश्न का उत्तर मुझे उत्तेजित नहीं करता है। यह कॉलम के बीच delimiters को संबोधित नहीं करता है। – RichardTheKiwi

उत्तर

13

जाहिर हर दो क्षेत्रों के बीच अल्पविराम के साथ सही देखने के लिए, आप इस प्रपत्र का उपयोग कर सकते हैं

;with users(City, State, Country) as (
select 'a', null, 'c' union all 
select 'a', 'b', 'c' union all 
select null, null, 'c') 

-- ignore above this line 
SELECT City, State, Country, 
    STUFF(
     ISNULL(', ' + City, '')+ 
     ISNULL(', ' + State, '')+ 
     ISNULL(', ' + Country, ''), 1, 2, '') AS 'Location' 
FROM Users 

आउटपुट

City State Country Location 
---- ----- ------- -------- 
a NULL c  a, c 
a b  c  a, b, c 
NULL NULL c  c 
+0

+1; मध्य मूल्यों को शून्य होने की संभावना पर विचार नहीं किया था, जो कि हिंडसाइट में स्पष्ट रूप से स्पष्ट प्रतीत होता है। –

+0

@ एडम भगवान 20/20 हिंदसाइट आशीर्वाद! – RichardTheKiwi

+0

मैं थोड़ा उलझन में हूं - क्या काम करने के लिए आवश्यक "उपरोक्त रेखा से अनदेखा" उपरोक्त सामान है? – JoeCool

2

हां यह जाने का रास्ता है। आप isnull() का भी उपयोग कर सकते हैं लेकिन coalesce अधिक मानक है। आप इस बात पर विचार कर सकते हैं कि क्या आपके पास शहर या देश में भी नलियां हो सकती हैं। आप यह भी मान सकते हैं कि उपयोगकर्ताओं के पास मल्टीपल पते हो सकते हैं और इस जानकारी के लिए एक से अधिक शहर, राज्य, देश और शायद संबंधित तालिका बेहतर हो सकती है।

+1

अधिक मानक? प्रशस्ति पत्र की जरूरत। – bzlm

+1

@bzlm: जबकि मैं अब तक नहीं कहूंगा कि यह "अधिक मानक" है (गोद लेने की दर के मामले में), लेकिन यह आमतौर पर नए विकास के लिए पसंदीदा वाक्यविन्यास है, बशर्ते कि यह उन सभी मामलों को शामिल करता है जो 'ISNULL' कवर करते हैं, साथ ही साथ अन्य (अतिरिक्त विकल्प चुनते हैं जिनके लिए एकाधिक 'ISNULL' कथन की आवश्यकता होती है, उदाहरण के लिए)। इसके अतिरिक्त, 'COALESCE' एसक्लसी पर उपलब्ध है, जबकि' ISNULL' नहीं है। –

+2

@Adam, @Bzlm जब तक हम SQLCE से बात नहीं कर रहे हैं, कोई बिंदु इसे खींच नहीं रहा है। बीटीडब्ल्यू, COALESCE के पास IsNull की तुलना में कुछ गतिशील टाइपिंग और प्रदर्शन समस्याएं हैं, इसलिए यदि आप SQL सर्वर (गैर-सीई) पर हैं, और केवल 2 मानों की आवश्यकता है, तो अनावश्यक रूप से COALESCE में शामिल न हों। – RichardTheKiwi

3

आप Concat समारोह एसक्यूएल 2012 में उपयोग कर सकते हैं और बाद में

SELECT City, State, Country, 
Concat(City, ', ', State, ', ', Country) AS 'Location' 
FROM Users 
संबंधित मुद्दे