कई पंक्तियों के साथ और पूर्ववर्ती अल्पविराम के बिना कैसे उपयोग करें?


27

मैं निम्नलिखित प्राप्त करने की कोशिश कर रहा हूं:

California | Los Angeles, San Francisco, Sacramento
Florida    | Jacksonville, Miami

दुर्भाग्य से, मैं "लॉस एंजिल्स, सैन फ्रांसिस्को, सैक्रामेंटो, जैक्सनविले, मियामी"

मैं STUFF फ़ंक्शन का उपयोग करके अपने वांछित परिणाम प्राप्त कर सकता हूं, लेकिन सोच रहा था कि क्या यह COALESCE का उपयोग करने का एक क्लीनर तरीका है?

STATE       | CITY
California  | San Francisco
California  | Los Angeles
California  | Sacramento
Florida     | Miami
Florida     | Jacksonville 


DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + city
FROM tbl where city = 'California';
SELECT @col;

धन्यवाद

जवाबों:


45

यह आपके बाद का क्लीनर दृष्टिकोण हो सकता है। मूल रूप से, जांचें कि क्या चर को अभी तक आरंभ किया गया है। यदि यह नहीं है, तो इसे खाली स्ट्रिंग पर सेट करें, और पहले शहर को जोड़ें (कोई अग्रणी अल्पविराम) नहीं। यदि यह है, तो एक अल्पविराम संलग्न करें, फिर शहर को जोड़ें।

DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
  FROM dbo.tbl WHERE state = 'California';

बेशक, यह केवल प्रति राज्य एक चर को आबाद करने के लिए काम करता है। यदि आप एक बार में प्रत्येक राज्य के लिए सूची खींच रहे हैं, तो एक शॉट में एक बेहतर समाधान है:

SELECT [state], cities = STUFF((
    SELECT N', ' + city FROM dbo.tbl
    WHERE [state] = x.[state]
    FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];

परिणाम:

state       cities
----------  --------------------------------------
California  San Francisco, Los Angeles, Sacramento  
Florida     Miami, Jacksonville

प्रत्येक राज्य के भीतर शहर के नाम से ऑर्डर करने के लिए:

SELECT [state], cities = STUFF((
    SELECT N', ' + city FROM dbo.tbl
    WHERE [state] = x.[state]
    ORDER BY city
    FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];

Azure SQL डेटाबेस या SQL Server 2017+ में, आप नए STRING_AGG()फ़ंक्शन का उपयोग कर सकते हैं :

SELECT [state], cities = STRING_AGG(city, N', ')
  FROM dbo.tbl
  GROUP BY [state]
  ORDER BY [state];

और शहर के नाम से आदेश दिया गया है:

SELECT [state], cities = STRING_AGG(city, N', ') 
                         WITHIN GROUP (ORDER BY city)
  FROM dbo.tbl
  GROUP BY [state]
  ORDER BY [state];

धन्यवाद हारून। मेरा वर्तमान समाधान आपके समरूप है, सिवाय इसके कि मैं ग्रुप BY के बजाय DISTINCT का उपयोग कर रहा हूं।
user2732180

2
@ user2732180 आपको एक ग्रुप BY का उपयोग करना चाहिए क्योंकि यह राज्य के अनुसार एक बार संघनन करने की अधिक संभावना है। DISTINCT के साथ, यह कैलिफ़ोर्निया के हर उदाहरण के लिए समान रूप से लागू होगा, उदाहरण के लिए, और उसके बाद ही उन सभी कामों को दूर फेंक दें जो उन डुप्लिकेट को उत्पन्न करते थे।
हारून बर्ट्रेंड

6

बस ऊपर हारून के जवाब में जोड़ने के लिए ...

ध्यान रखें कि ORDER BYआपकी क्वेरी में केवल अंतिम आइटम शामिल करके ही विराम हो सकता है। मेरे मामले में, मैं समूहीकरण नहीं कर रहा था, इसलिए यह निश्चित नहीं है कि इससे कोई फर्क पड़ता है। मैं SQL 2014 का उपयोग कर रहा हूं। मेरे मामले में, मेरे पास value1, value2, value3 जैसे कुछ हैं ... लेकिन चर में मेरा परिणाम केवल value3 था।


हारून ने टिप्पणी करते हुए कहा:

यह कनेक्ट पर कम से कम चार बार सूचित किया गया है:

  1. फ़िल्टर परिणामों द्वारा परिवर्तनीय संघनन और क्रम में (जैसे जहां स्थिति)
  2. (n) ORDER BY जोड़े जाने पर ResultSet से varchar बिल्डिंग विफल हो जाती है
  3. CROSS APPLYs के साथ एक ऑर्डर किए गए चयन से एक स्थानीय चर असाइन करना और एक टेबल-वैल्यू फ़ंक्शन केवल अंतिम मान देता है
  4. जब तालिका चर से समवर्ती varchar (अधिकतम) / nvarchar (अधिकतम) मान, गैर-प्राथमिक-कुंजी कॉलम द्वारा फ़िल्टरिंग और ऑर्डर करने पर गलत परिणाम वापस आ सकते हैं।

Microsoft से उदाहरण प्रतिक्रिया:

जो व्यवहार आप देख रहे हैं वह डिजाइन द्वारा है। ORDER BY क्लॉज वाले प्रश्नों में असाइनमेंट ऑपरेशंस (इस उदाहरण में संक्षिप्तिकरण) का उपयोग करना अपरिभाषित व्यवहार है।

प्रतिक्रिया भी KB 287515 का संदर्भ देती है:

PRB: निष्पादन योजना और परिणामी अवतरण क्वेरी के परिणाम अभिव्यक्ति स्थान पर निर्भर करते हैं

समाधान का उपयोग करना है FOR XML PATH(हारून के उत्तर में दूसरा दृष्टिकोण) यदि संक्षेपण का क्रम महत्वपूर्ण है और निश्चित रूप से, यदि आप सभी मूल्यों को शामिल करना सुनिश्चित करना चाहते हैं। और देखें:

स्टैक ओवरफ्लो पर nvarchar संघनन / सूचकांक / nvarchar (अधिकतम) अकथनीय व्यवहार

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.