2009-10-14 17 views
10

मैं एसक्यूएल उपयोग करने के लिए cat_id केएक अल्पविराम से अलग सूची का निर्माण?

कोड की अल्पविराम द्वारा अलग सूची बनाने के लिए कोशिश कर रहा हूँ है:

declare  @output varchar(max) 
set   @output = null; 
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id) 

संपादित करें: अशक्त करने के लिए '' बदल गया है, अब भी वही। लेकिन उत्पादन im हो रही इसलिए की तरह है:

, 66 , 23 

प्रमुख अल्पविराम वहाँ नहीं होना चाहिए। मुझे क्या याद आया?

उत्तर

37

क्या आप एसक्यूएल 2005 पर हैं? Rob Farley को रंगमंच की सामग्री, जो अभी हाल ही में यह मेरे से पता चला है के साथ:

SELECT stuff((
    SELECT ', ' + cast(cat_id as varchar(max)) 
    FROM categories 
    FOR XML PATH('') 
    ), 1, 2, ''); 

अंदर क्वेरी (FOR XML PATH('') के साथ) के साथ एक प्रमुख "," की श्रेणी आईडी अल्पविराम से अलग की सूची का चयन करता है,। बाहरी कॉमा और स्पेस को हटाने के लिए बाहरी क्वेरी stuff फ़ंक्शन का उपयोग करती है।

मेरे पास इसका परीक्षण करने के लिए एक SQL उदाहरण आसान नहीं है, इसलिए यह स्मृति से है। आपको सामान पैरामीटर आदि के साथ खेलना पड़ सकता है ताकि आप इसे ठीक से काम कर सकें। सिर्फ इस क्वेरी के निष्पादन से पहले

+0

ठीक है, मैं यह परीक्षण किया है और यह काम करता के रूप में है। मैं निश्चित रूप से 'एक चर के लिए संलग्न' तकनीक पर इसकी सिफारिश करेंगे। –

+1

यह जंगली एसक्यूएल जादूगर आपने यहां क्या दिखाया है! राक्षसों की शुरुआत करो! – JDPeckham

+0

मैं इस उत्तर में शामिल होना चाहता था - बहुत सारे स्टूफ स्टेटमेंट्स के लिए आप वास्तव में अल्पविराम से अलग सूची बनाने के लिए पैरामीटर 1 और 1, 1 और 2 नहीं चाहते हैं। मैट का जवाब 2 का उपयोग करता है क्योंकि उसके पास प्रत्येक कॉमा के बाद एक जगह होती है। अधिक जानकारी के लिए, एमएसडीएन आलेख देखें: http://msdn.microsoft.com/en-us/library/ms188043.aspx – Ryanman

0

जांच @output मूल्य, मुझे लगता है कि यह NULL के बराबर नहीं है, लेकिन करने के लिए '' (खाली स्ट्रिंग)

संपादित करें: (के बाद @auth प्रश्न संपादित)

अब

: मुझे यकीन है कि यह है 'आप NULL

करने के लिए इसे प्रारंभ CONCAT_NULL_YIELDS_NULL की स्वतंत्र रूप से यह करने के लिए, का उपयोग पुराने CASE WHEN करने के लिए है हूँ,

select @output = NULL 
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value 
+0

तब भी 'CONCAT_NULL_YIELDS_NULL' को 'ON' –

+0

पर सेट करने की आवश्यकता है, धन्यवाद, मैंने नहीं किया ऐसा कोई विकल्प नहीं पता था! सूचकांक के लिए – manji

0

क्या आपने @output को खाली स्ट्रिंग में प्रारंभ किया था? COALESCE केवल तभी काम करेगा जब यह एक पूर्ण स्ट्रिंग है।

0

आप क्या गलत कर रहे हैं यह है कि @output प्रारंभ से शून्य नहीं है, लेकिन एक खाली स्ट्रिंग है। लूप से पहले @output को शून्य पर सेट करें (या यदि इसका उपयोग नहीं किया गया है, तो इसे केवल खाली स्ट्रिंग असाइन न करें)।

2

COALESCE Returns the first nonnull expression among its arguments

पहले तर्क @output + ', ' कभी नहीं रिक्त है (जब तक आप @output के रूप में अशक्त प्रारंभ और ON करने के लिए CONCAT_NULL_YIELDS_NULL सेट), तो यह हमेशा वापस आ रहा है।

+1

+1 एएनएसआई संपत्ति के लिए +1। अपने वर्तमान मूल्य को देखने के लिए "सत्र सत्रप्रोर्टी ('CONCAT_NULL_YIELDS_NULL') का चयन करें; यह डिफ़ॉल्ट रूप से 1 है, लेकिन यदि यह 0 है, तो यह पोस्टर का कोल्स विफल होने का कारण बनता है। – Andomar

0

और कभी-कभी ...

आप वास्तव में आप जो खोज रहे हैं करने के लिए अपने ही सवाल का

declare  @output varchar(max) 
select  @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id) 
1
declare  @output varchar(max) 

select  @output = coalesce 
         ( 
          @output + ', ' + convert(varchar(max),cat_id), 
          convert(varchar(max),cat_id) 
        ) 
from  yourTableHere 

print  @output 
0

सुनिश्चित नहीं हैं कि अगर यह लागू होता है जवाब देने के लिए है, लेकिन मैं पर यह अधिकार मिल गया उसी समय मुझे आपके प्रश्न मिल गए। मैं एक्सएमएल पाथ के साथ दूसरे समाधान का उपयोग करता हूं, जो मैट हैमिल्टन ने ऊपर वर्णित किया है। यह मेरे लिए बहुत अच्छा काम किया है।

पंक्तियों को जोड़ना - कार्ल पी द्वारा।एंडरसन, 2009/10/14

http://www.sqlservercentral.com/articles/T-SQL/67973/

0
/osp/install/idp/bin/sqlminus "select ri || ',' ||name|| ',' || numports || ',' || ascii(OVRONSET) from sdfctigw.ivrgrp where GRP_BEP is not null;" | sort -h 
1,COMO INTERNAL 2,700,90 
7,LOADIVR,10,80 
10,SPEECH_IVR_PROD,600,95 
संबंधित मुद्दे