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

एसक्यूएल प्रतिस्थापन समारोह के अंदर रेगेक्स पैटर्न?

आप पैटर्न (स्ट्रिंग की) घटना की पहली अनुक्रमणिका खोजने के लिए PATINDEX का उपयोग कर सकते हैं। फिर मिलान किए गए पैटर्न (स्ट्रिंग) में एक और स्ट्रिंग को भरने के लिए STUFF का उपयोग करें।

प्रत्येक पंक्ति के माध्यम से लूप। प्रत्येक अवैध पात्रों को आप जो चाहते हैं उससे बदलें। आपके मामले में गैर-संख्यात्मक को रिक्त स्थान से बदलें। आंतरिक लूप यह है कि यदि आपके पास वर्तमान सेल में लूप के एक से अधिक अवैध वर्ण हैं।

DECLARE @counter int

SET @counter = 0

WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table))
BEGIN  

    WHILE 1 = 1
    BEGIN
        DECLARE @RetVal varchar(50)

        SET @RetVal =  (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '')
        FROM Table
        WHERE ID_COLUMN = @counter)

        IF(@RetVal IS NOT NULL)       
          UPDATE Table SET
          Column = @RetVal
          WHERE ID_COLUMN = @counter
        ELSE
            break
    END

    SET @counter = @counter + 1
END

सावधानी:हालांकि यह धीमा है! वर्चर कॉलम होने से असर पड़ सकता है। तो एलटीआरआईएम आरटीआरआईएम का उपयोग करने से थोड़ी मदद मिल सकती है। भले ही, यह धीमा है।

श्रेय इस StackOverFlow उत्तर को जाता है।

EDITCredit @srutzky को भी जाता है

संपादित करें (@Tmdean द्वारा) एक समय में एक पंक्ति करने के बजाय, इस उत्तर को अधिक सेट-आधारित समाधान के लिए अनुकूलित किया जा सकता है। यह अभी भी एक ही पंक्ति में गैर-संख्यात्मक वर्णों की अधिकतम संख्या को पुनरावृत्त करता है, इसलिए यह आदर्श नहीं है, लेकिन मुझे लगता है कि इसे अधिकांश स्थितियों में स्वीकार्य होना चाहिए।

WHILE 1 = 1 BEGIN
    WITH q AS
        (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
        FROM Table)
    UPDATE Table
    SET Column = STUFF(Column, q.n, 1, '')
    FROM q
    WHERE Table.ID_Column = q.ID_Column AND q.n != 0;

    IF @@ROWCOUNT = 0 BREAK;
END;

यदि आप तालिका में थोड़ा सा कॉलम बनाए रखते हैं जो इंगित करता है कि फ़ील्ड को अभी तक साफ़ किया गया है या नहीं, तो आप दक्षता में काफी सुधार कर सकते हैं। (NULL मेरे उदाहरण में "अज्ञात" का प्रतिनिधित्व करता है और कॉलम डिफ़ॉल्ट होना चाहिए।)

DECLARE @done bit = 0;
WHILE @done = 0 BEGIN
    WITH q AS
        (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
        FROM Table
        WHERE COALESCE(Scrubbed_Column, 0) = 0)
    UPDATE Table
    SET Column = STUFF(Column, q.n, 1, ''),
        Scrubbed_Column = 0
    FROM q
    WHERE Table.ID_Column = q.ID_Column AND q.n != 0;

    IF @@ROWCOUNT = 0 SET @done = 1;

    -- if Scrubbed_Column is still NULL, then the PATINDEX
    -- must have given 0
    UPDATE table
    SET Scrubbed_Column = CASE
        WHEN Scrubbed_Column IS NULL THEN 1
        ELSE NULLIF(Scrubbed_Column, 0)
    END;
END;

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल का उपयोग करके SQL सर्वर इंस्टेंस में बहिष्कृत सुविधाओं को कैसे सूचीबद्ध करें

  2. लेन-देन त्रुटि और लेन-देन के दायरे की स्थिति के लिए कार्रवाई मान्य नहीं है

  3. एक्सेल में SQL क्वेरी डेटा निर्यात करें

  4. मैं SQL सर्वर 2005 में कॉलम के रूप में यादृच्छिक संख्या कैसे वापस कर सकता हूं?

  5. मैं SQL सर्वर में एक विदेशी कुंजी कैसे बनाऊं?