2014-10-30 22 views
4

我想刪除給定表格列中的重複字符串。刪除SQL Server中的重複字符串

下面是一些例子:

Input  | Expected Output 
--------------------------- 
XYXY  | XY 
AA  | A 
XYZXYZ | XYZ 
ABCABCABC | ABC 

我該怎麼辦呢?

+2

你還沒有真正問一個具體問題...你嘗試過這麼遠嗎? – 2014-10-30 11:18:33

+0

真的這個問題值得讚賞嗎? – Wanderer 2014-10-30 11:25:54

+2

@Ullas:我認爲是。我覺得它很有趣。對我來說很明顯,我希望看到一個答案。 – 2014-10-30 11:28:50

回答

1

使用三個邏輯來獲得輸出。

首先通過使用CTE

由具有row_number()對於內CTE的每一行,這將在下一步驟中使用查找每行中不同的字母。

第三concatenate the rows using group by row_number()它是在第二步創建的。

CREATE TABLE #input 
    (name VARCHAR(50)) 

INSERT INTO #input 
VALUES  ('XYXY'), 
      ('AA'), 
      ('XYZXYZ'), 
      ('ABCABCABC'); 

WITH cte 
    AS (SELECT Row_number()OVER (ORDER BY name) rn, 
       Substring(name, 1, 1) AS sub, 
       1      AS IDX, 
       name 
     FROM #input 
     WHERE Len(name) > 0 
     UNION ALL 
     SELECT rn,Substring(name, IDX + 1, 1) AS sub, 
       IDX + 1      AS IDX, 
       name 
     FROM cte 
     WHERE IDX < Len(name)) 
SELECT name INPUT, (SELECT DISTINCT CONVERT(VARCHAR(100), sub) 
       FROM cte b 
       WHERE b.rn = a.rn 
       FOR XML PATH('')) EXPECTED_OUTPUT 
FROM cte a 
GROUP BY rn ,name 

輸出

INPUT  EXPECTED_OUTPUT 
--------- --------------- 
AA   A 
ABCABCABC ABC 
XYXY  XY 
XYZXYZ  XYZ 
+0

很好的答案,但是破壞了大多數非人爲的例子。嘗試'Jamiea'的輸入,它有一個重複的'a',但它破壞了輸出。正如上述意見所預期的那樣,OP沒有提供足夠的信息來正確回答這個問題。所有的OP的例子都是按字母順序排列的,我懷疑現實世界並不是那麼統一的 – Jamiec 2014-10-30 12:40:27

+0

@Jamiec - 你是禮拜儀式我正在努力。 – 2014-10-30 12:50:21

5

這個查詢將有助於你。

SELECT dbo.RemoveDuplicate(ColumnName,VariableLength)FROM TableName。

示例: SELECT dbo.RemoveDuplicate(StudentName,20)FROM Students。

功能來刪除重複的字符串:

CREATE FUNCTION RemoveDuplicate (@sInputString AS VARCHAR(10), @nLength AS INT) 
RETURNS VARCHAR(Max) AS 
BEGIN 
    DECLARE @count INT 
    DECLARE @new_string VARCHAR(Max) 
    SET @count=1 
    WHILE (@count <= @nLength) 
     BEGIN 
      IF (@new_string IS NULL) 
      BEGIN 
       SET @new_string='' 
      END 
      SET @[email protected]_string + Substring(@sInputString, 1, 1) 
      SET @sInputString=REPLACE(@sInputString, Substring(@sInputString, 1, 1), '') 
      SET @[email protected] + 1 
     END 
    RETURN @new_string 
END 
+0

您是否找到其他優化方式? – 2014-11-07 14:29:44