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

दोहराए गए सबस्ट्रिंग ढूंढें और निकालें

यदि आपके पास पहले से कोई संख्या तालिका नहीं है:

SET NOCOUNT ON;
DECLARE @UpperLimit INT;
SET @UpperLimit = 4000;

WITH n(rn) AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
    FROM sys.all_columns
)
SELECT [Number] = rn - 1
INTO dbo.Numbers FROM n
WHERE rn <= @UpperLimit + 1;

CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers([Number]);

अब एक सामान्य स्प्लिट फ़ंक्शन, जो आपके सीमांकित स्ट्रिंग को एक सेट में बदल देगा:

CREATE FUNCTION dbo.SplitString
(
    @List NVARCHAR(MAX),
    @Delim CHAR(1)
)
RETURNS TABLE
AS
    RETURN ( SELECT 
        rn, 
        vn = ROW_NUMBER() OVER (PARTITION BY [Value] ORDER BY rn), 
        [Value]
      FROM 
      ( 
        SELECT 
          rn = ROW_NUMBER() OVER (ORDER BY CHARINDEX(@Delim, @List + @Delim)),
          [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
          CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
        FROM dbo.Numbers
        WHERE Number <= LEN(@List)
        AND SUBSTRING(@Delim + @List, [Number], 1) = @Delim
      ) AS x
    );
GO

और फिर एक फ़ंक्शन जो उन्हें वापस एक साथ रखता है:

CREATE FUNCTION dbo.DedupeString
(
    @List NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    RETURN ( SELECT newval = STUFF((
     SELECT '\' + x.[Value] FROM dbo.SplitString(@List, '\') AS x
      WHERE (x.vn = 1)
      ORDER BY x.rn
      FOR XML PATH, TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
    );
END
GO

नमूना उपयोग:

SELECT dbo.DedupeString('alpha\bravo\bravo\charlie\delta\bravo\charlie\delta');

परिणाम:

alpha\bravo\charlie\delta

आप कुछ ऐसा भी कह सकते हैं:

UPDATE dbo.MessedUpTable
  SET OopsColumn = dbo.DedupeString(OopsColumn);

@MikaelEriksson शायद डुप्लिकेट को खत्म करने के लिए XML का उपयोग करने के लिए एक अधिक कुशल तरीके से झपट्टा मारेगा, लेकिन तब तक मैं यही पेशकश कर सकता हूं। :-)



  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. SQL सर्वर 2019 में स्केलर UDF इनलाइनिंग

  3. SQL सर्वर 2017:Linux पर उपलब्ध सुविधाएँ

  4. SQL कनेक्शन त्रुटि:System.Data.SqlClient.SqlException (0x80131904)

  5. एक कॉलम पर DISTINCT चुनें