Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

सीटीई का उपयोग करके स्ट्रिंग स्प्लिट करने का कुशल तरीका

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

DECLARE @YourTable table (RowID int, Layout varchar(200))
INSERT @YourTable VALUES (1,'hello,world,welcome,to,tsql')
INSERT @YourTable VALUES (2,'welcome,to,stackoverflow')

;WITH SplitSting AS
(
    SELECT
        RowID,LEFT(Layout,CHARINDEX(',',Layout)-1) AS Part
            ,RIGHT(Layout,LEN(Layout)-CHARINDEX(',',Layout)) AS Remainder
        FROM @YourTable
        WHERE Layout IS NOT NULL AND CHARINDEX(',',Layout)>0
    UNION ALL
    SELECT
        RowID,LEFT(Remainder,CHARINDEX(',',Remainder)-1)
            ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder))
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0
    UNION ALL
    SELECT
        RowID,Remainder,null
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0
)
SELECT * FROM SplitSting ORDER BY RowID

आउटपुट:

RowID       Part                   
----------- -----------------------
1           hello                  
1           world                  
1           welcome                
1           to                     
1           tsql                   
2           welcome                
2           to                     
2           stackoverflow          

(8 row(s) affected)

यहाँ SQL सर्वर में स्ट्रिंग्स को विभाजित करने पर एक उत्कृष्ट लेख है:SQL सर्वर 2005 और उसके बाद, जब टेबल वैल्यू पैरामीटर्स डू नॉट कट इट" एरलैंड सोमरस्कोग द्वारा

संपादित करें यहां एक और संस्करण है (लेकिन आपको एक संख्या तालिका की आवश्यकता है) ऊपर के समान परिणाम देता है:

;WITH SplitValues AS
(
    SELECT
        RowID,ListValue
        FROM (SELECT
                  RowID, LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(',', List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT RowID, ',' + Layout + ',' AS List2
                           FROM @YourTable
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = ','
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''
)
SELECT * FROM SplitValues

संख्या तालिका के लिए यहां देखें:संख्या तालिका बनाने और उसे भरने का सबसे अच्छा तरीका क्या है?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल सर्वर 2008 - क्या एक ट्रिगर लॉगिन/उपयोगकर्ता के समान अनुमतियों के साथ चलता है?

  2. SQL सर्वर 2008 में घंटे और मिनटों का योग

  3. लिंक किए गए सर्वर के लिए OLE DB प्रदाता Microsoft.Jet.OLEDB.4.0 का एक उदाहरण नहीं बना सकता नल

  4. SQL सर्वर में उसी तालिका के भीतर एक कॉलम को दूसरे कॉलम में कैसे सम्मिलित करें?

  5. SQL सर्वर में डेटाबेस मेल सक्षम करें (T-SQL)