删除SQL Server中的重复字符串

删除SQL Server中的重复字符串,sql,sql-server,Sql,Sql Server,我想删除给定表列中的重复字符串 以下是一些例子: Input | Expected Output --------------------------- XYXY | XY AA | A XYZXYZ | XYZ ABCABCABC | ABC 我该怎么做?使用三个逻辑来获得输出 First是使用CTE在每行中查找不同的字母 Second为下一步将使用的CTE内的每一行设置行号() 第三个是使用第二步中创建的group by row_number()连接行

我想删除给定表列中的重复字符串

以下是一些例子:

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

我该怎么做?

使用三个逻辑来获得输出

First是使用
CTE在每行中查找不同的字母

Second为下一步将使用的CTE内的每一行设置
行号()

第三个是使用第二步中创建的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

此查询将对您有所帮助

从TableName中选择dbo.RemoveDuplicate(ColumnName,VariableLength)。

示例:从学生中选择dbo.RemoveDuplicate(StudentName,20)

用于删除重复字符串的函数:

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 @new_string=@new_string + Substring(@sInputString, 1, 1)
          SET @sInputString=REPLACE(@sInputString, Substring(@sInputString, 1, 1), '')
          SET @count=@count + 1
      END
    RETURN @new_string 
END
CREATE FUNCTION RemoveDuplicate(@sInputString作为VARCHAR(10),@nLength作为INT)
将VARCHAR(Max)返回为
开始
声明@countint
声明@new_string VARCHAR(最大值)
设置@count=1

当你还没有真正地问一个具体的问题……到目前为止你尝试了什么?真的这个问题值得一提吗?”我想是这样。我觉得它很有趣。对我来说,这是很清楚的,我喜欢看一个关于它的答案。如果没有重复的字符串(例如,输入“ab”)呢?或者中间有一个重复的字符串(例如“AXXB”)。?或多次重复…等等。请看我对下面答案的评论,我怀疑在现实世界中,并不是所有的例子都是按照好的、统一的、字母顺序排列的。答案不错,但会破坏大多数非人为的例子。试着输入
Jamiea
它有一个重复的
a
,但会破坏输出。正如上面的评论所预期的,OP没有提供足够的信息来正确回答这个问题。OP的所有示例都是按字母顺序排列的,我怀疑现实世界并不那么统一。你有没有找到其他优化方法?
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 @new_string=@new_string + Substring(@sInputString, 1, 1)
          SET @sInputString=REPLACE(@sInputString, Substring(@sInputString, 1, 1), '')
          SET @count=@count + 1
      END
    RETURN @new_string 
END