Null के साथ SQL Server स्ट्रिंग कॉनट्रैटेनेशन


85

मैं उन क्षेत्रों में एक संगणित कॉलम बना रहा हूं जिनमें से कुछ संभावित रूप से अशक्त हैं।

समस्या यह है कि यदि उन क्षेत्रों में से कोई भी शून्य है, तो संपूर्ण गणना स्तंभ शून्य होगा। मैं Microsoft दस्तावेज़ से समझता हूं कि यह अपेक्षित है और इसे SET CONCAT_NULL_YIELDS_NULL सेटिंग के माध्यम से बंद किया जा सकता है। हालाँकि, मैं इस डिफ़ॉल्ट व्यवहार को बदलना नहीं चाहता क्योंकि मैं SQL सर्वर के अन्य भागों पर इसके निहितार्थ नहीं जानता।

क्या मेरे लिए यह जांचने का एक तरीका है कि क्या कोई स्तंभ शून्य है और केवल गणना किए गए स्तंभ सूत्र के भीतर इसकी सामग्री को जोड़ना है, यदि यह शून्य नहीं है?


2
स्वीकृत प्रश्न उस समय सही था जब प्रश्न पूछा गया था, लेकिन SQL सर्वर 2012 और बाद में सभी के लिए (और यह चरण जो सभी को होना चाहिए) @ मार्टिन-स्मिथ उत्तर सबसे अच्छा है क्योंकि यह स्वतः नल को संभालता है।
डोलर्स

जवाबों:


142

आप उपयोग कर सकते हैं ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')

यदि स्तंभ / अभिव्यक्ति का मान वास्तव में NULL है, तो इसके बजाय निर्दिष्ट दूसरा मान (यहां: रिक्त स्ट्रिंग) का उपयोग किया जाएगा।


22
"Coalesce" ANSI- मानक फ़ंक्शन नाम है, लेकिन ISNULL वर्तनी में आसान है।
फिलिप केली

1
और ISNULL एसक्यूएल सर्वर पर तेजी से एक बालक प्रतीत होता है, इसलिए भी - यदि आप इसे एक फ़ंक्शन में उपयोग करना चाहते हैं जो एक संगणित कॉलम में तारों को समाहित करता है , तो आप एएनएसआई मानक को छोड़ सकते हैं और गति का चयन कर सकते हैं (एडम मैकॉनिक देखें: sqlblog.com / ब्लॉग्स / adam_machanic / आर्काइव / 2006/07/12 /… )
marc_s

बस इस Isnull (,) क्वेरी का उपयोग किया है, यह बहुत अधिक आकार देता है क्योंकि मैं एक साथ मूल्यों को समेट रहा था और यदि उनमें से एक शून्य था तो सब कुछ शून्य हो गया।
10

का उपयोग करना ISNULL()एक अच्छा समाधान है, लेकिन SQL सर्वर 2012 से, आप CONCATसमान परिणाम प्राप्त करने के लिए फ़ंक्शन का भी उपयोग कर सकते हैं :CONCAT(@Column1, @Column2)
मुहम्मद मुसावी

2
यहां यह ध्यान देने योग्य है कि यदि आप nullखाली स्ट्रिंग के अलावा किसी और चीज के लिए स्वैप करना चाहते हैं , यानी IsNull(@Column1, 'NULLVALUE'), IsNullप्रतिस्थापन स्ट्रिंग की लंबाई उस स्तंभ की लंबाई तक सीमित है, जिसकी जगह यह नहीं है, जबकि यह नहीं हैCoalesce
जेमी

58

SQL सर्वर 2012 से यह CONCATफ़ंक्शन के साथ बहुत आसान है ।

यह NULLखाली स्ट्रिंग के रूप में व्यवहार करता है

DECLARE @Column1 VARCHAR(50) = 'Foo',
        @Column2 VARCHAR(50) = NULL,
        @Column3 VARCHAR(50) = 'Bar';


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/

धन्यवाद! मुझे यही चाहिए था !!
शिव

पुराने संस्करणों के लिए आपको "'CONCAT' एक मान्यता प्राप्त बिल्ट-इन फ़ंक्शन नाम नहीं है", इसलिए COALESCE
Savage

3
@ सैवेज - COALESCE अभ्यस्त काम नहीं है क्योंकि यह समाप्‍त नहीं करता है, यह सिर्फ पहला अशक्त तर्क देता है
कोड्यूलिक


12

उपयोग

SET CONCAT_NULL_YIELDS_NULL  OFF 

और एक स्ट्रिंग के लिए अशक्त मानों के संघटन के परिणामस्वरूप अशक्त नहीं होगा।

कृपया ध्यान दें कि यह एक पदावनत विकल्प है, उपयोग करने से बचें। देखें प्रलेखन अधिक जानकारी के लिए।


11

आप CASE का उपयोग कर सकते हैं - मेरे कोड नीचे दिए गए चेक में शून्य मान और रिक्त स्ट्रिंग्स दोनों के लिए है, और केवल एक सेपरेटर जोड़ता है यदि कोई मान है जिसका अनुसरण करना है:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 

8

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

इसलिए विभिन्न क्षेत्रों से एक पंक्ति का पता बनाने के उदाहरण में

पता 1 , पता 2 , पता 3 , शहर , पोस्टकोड

मेरे मामले में, मेरे पास निम्नलिखित कॉलम है, जो मुझे लगता है कि काम कर रहा है:

case 
    when [Address1] IS NOT NULL 
    then (((          [Address1]      + 
          isnull(', '+[Address2],'')) +
          isnull(', '+[Address3],'')) +
          isnull(', '+[City]    ,'')) +
          isnull(', '+[PostCode],'')  
end

आशा है कि किसी की मदद करता है!


वहाँ बहुत बेमानी नेस्टेड ब्रैकेटिंग है जिसे हटाया जा सकता है। एक और टिप यह है कि आप केस स्टेटमेंट को भी हटा सकते हैं जैसे कि पता 1 अशक्त है पूरी अभिव्यक्ति शून्य का मूल्यांकन करेगी (हालांकि केस स्टेटमेंट ध्यान आकर्षित करता है कि ऐसा हो सकता है)
अल्टरनेटर


1

मुझे इससे भी बहुत परेशानी थी। उपरोक्त उदाहरणों का उपयोग करके इसे काम नहीं कर सका, लेकिन यह मेरे लिए काम करता है:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),'  ',' ')

बदलें उन दोनों के बीच कुछ भी नहीं के साथ एकल रिक्त स्थान को बदलने के कारण दोहरे स्थान को सही करता है। r / ltrim सिरों पर किसी भी रिक्त स्थान से छुटकारा दिलाता है।


0

Sql सर्वर में:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'xyz@xyz.com')

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.

कोड के पीछे:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')

0

यह उदाहरण आपको सम्मिलित कथन बनाते समय विभिन्न प्रकारों को संभालने में मदद करेगा

select 
'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 
'values(' +
      '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier
    + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date
    + '''' + Str+ ''',' -- string
    + '''' + convert(nvarchar(50), Code)  + ''',' -- int
    + convert(nvarchar(50), Price) + ',' -- decimal
    + '''' + ISNULL(Tag, '''''') + '''' + ')'  -- nullable string

 from doc
 where CDate> '2019-01-01 00:00:00.000'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.