2010-12-04 13 views
5

को सूची कैसे मैं एक पंक्ति में एक अल्पविराम सूची क्षेत्र बारी और एक कॉलम में प्रदर्शित करते हैं?TSQL का चयन करें अल्पविराम पंक्तियों

उदाहरण के लिए,

ID | Colour 
------------ 
1 | 1,2,3,4,5 

रहे हैं:

ID | Colour 
------------ 
1 | 1 
1 | 2 
1 | 3 
1 | 4 
1 | 5 
+0

और एक प्रश्न जो कई बार पहले पूछा गया है ... एक ऐसा उदाहरण: http://stackoverflow.com/questions/4250475/split-one-column-into-multiple-rows –

+0

@ मार्क बेयर्स: यह डेटाबेस एक PHP वेबसाइट की तरह कुछ से सूचियों को संग्रहित करने के लिए डिज़ाइन अनुकूलित किया गया है। यह एसक्यूएल लोगों के लिए भयानक है लेकिन फ्रंट एंड डेवलपर्स के लिए सुविधाजनक है। चयन – Andomar

उत्तर

5

इस हल करने के लिए हमेशा की तरह एक विभाजन समारोह बनाने के लिए है। आप Google से एक को पकड़ सकते हैं, उदाहरण के लिए this one from SQL Team

create table colours (id int, colour varchar(255)) 
insert colours values (1,'1,2,3,4,5') 

select colours.id 
,  split.data 
from colours 
cross apply 
     dbo.Split(colours.colour, ',') as split 

यह प्रिंट: एक बार जब आप समारोह बना लें, तो आप इसे पसंद का उपयोग कर सकते

id data 
1  1 
1  2 
1  3 
1  4 
1  5 
+0

dbo.XW_Wheels.ID, dbo.Splitter (XW_Wheels.Colours, ',') XW_Wheels से पार विभाजन के रूप में dbo.Splitter (XW_Wheels.Colours, ',') लागू करते हैं और मैं यह संदेश प्राप्त "या तो नहीं खोजा जा सका कॉलम "डीबीओ" या उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन या कुल "dbo.Splitter", या नाम संदिग्ध है। " – Rya

+0

dbo.XW_Wheels.ID का चयन करें, विभाजित XW_Wheels से पार विभाजन के रूप में dbo.Splitter (XW_Wheels.Colours, ',') लागू करते हैं और मैं GET "अमान्य स्तंभ नाम 'विभाजित'।" – Rya

+0

फ़ंक्शन 'dbo.Split' एक तालिका देता है। केवल 'विभाजन' के बजाय 'split.data' का चयन करने का प्रयास करें। – Andomar

2

एक अन्य संभावित समाधान, एक्सएमएल उपयोग करने के लिए (आप यह सोचते हैं SQL सर्वर 2005 या अधिक से अधिक के साथ काम कर रहे हैं) है:

DECLARE @s TABLE 
    (
     ID INT 
    , COLOUR VARCHAR(MAX) 
    ) 

INSERT INTO @s 
VALUES (1, '1,2,3,4,5') 

SELECT s.ID, T.Colour.value('.', 'int') AS Colour 
FROM (SELECT ID 
        , CONVERT(XML, '<row>' + REPLACE(Colour, ',', '</row><row>') + '</row>') AS Colour 
      FROM  @s a 
     ) s 
     CROSS APPLY s.Colour.nodes('row') AS T(Colour) 
+0

बेहतर अभी तक: चुनें T.name.value ('।',' Nvarchar (4000) ') रंग से (बदलें चुनें (XML,' '+ REPLACE (नाम,', ',' ') +' ') के रूप में नाम से (चुनें' 1, 2,3,4,5 'नाम) ) एस क्रॉस लागू करें name.nodes (' पंक्ति ') एएस टी (नाम) – kerem

1

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन सोचा कि मैं एक अपडेट जोड़ूंगा। टैली टेबल और सीटीटी टेबल आधारित स्प्लिटर सभी में एक बड़ी समस्या है। वे concatenated delimiters का उपयोग करते हैं और जब तत्व व्यापक हो जाते हैं और तार लंबे हो जाते हैं तो उनकी गति को मार देता है।

मैंने उस समस्या को ठीक कर दिया है और इसके बारे में एक लेख लिखा है जो उसके बाद यूआरएल पर पाया जा सकता है। http://www.sqlservercentral.com/articles/Tally+Table/72993/

नई विधि जबकि VARCHAR के लिए लूप, रिकर्सिव CTE, और XML तरीकों सब (8000) के बंद दरवाजे चल रही है।

मैं आपको यह भी बता दूंगा कि "पीटर" के नाम से एक साथी ने उस कोड (लेख के लिए चर्चा में) में भी सुधार किया है। लेख अभी भी दिलचस्प है और मैं अगले दिन या दो में पीटर के संवर्धन के साथ अनुलग्नक अपडेट कर दूंगा। मेरे बड़े संवर्द्धन और ट्वीक पीटर के बीच, मुझे विश्वास नहीं है कि आपको VARCHAR (8000) को विभाजित करने के लिए एक तेज़ टी-एसक्यूएल-केवल समाधान मिलेगा। मैंने VARCHAR (MAX) के लिए स्प्लिटर की इस नस्ल के लिए भी समस्या हल की है और इसके लिए एक लेख लिखने की प्रक्रिया में भी हूं।

संबंधित मुद्दे