我需要一个T-SQL函数来删除给定字符串中的重复字符
例如Fn_Remove('AVGHAHA') 它将返回AVGH
答案 0 :(得分:2)
使用NGrams8K
,您可以将字符串分成单个字符“令牌”,将数字应用于该字符集,然后仅使用每个字符的第一个进行重建:
WITH CTE AS(
SELECT V.S,
N.position,
N.token,
ROW_NUMBER() OVER (PARTITION BY N.token ORDER BY N.position) AS RN
FROM (VALUES('AVGHAHA'))V(S)
CROSS APPLY dbo.NGrams8k(V.S,1) N)
SELECT V.S,
(SELECT '' + C.token
FROM CTE C
WHERE C.S = V.S
AND C.RN = 1
ORDER BY C.position
FOR XML PATH('')) AS Replaced
FROM (VALUES('AVGHAHA'))V(S);
答案 1 :(得分:1)
首先创建一个数字表,其数字从1
开始向上递增。
然后您就可以使用
SELECT STRING_AGG (Char, '') WITHIN GROUP (ORDER BY Pos ASC) AS csv
FROM
(
SELECT SUBSTRING(@String, number, 1) AS Char, MIN(number) AS Pos
FROM Nums
WHERE number <= LEN(@String)
GROUP BY SUBSTRING(@String, number, 1)
) T
这将默认排序规则的语义用于相等性。如果需要其他内容,请使用显式COLLATE
子句。
如果您使用的版本不支持STRING_AGG
,则可以使用XML PATH
进行字符串连接。
答案 2 :(得分:1)
另一种方法可以使用递归CTE
,这是我昨天从@Gordon Linoff的答案之一中学到的。
;with cte as (
select v.input, convert(varchar(max), '') as updated, 1 as lev
from (values ('AVGHAHA')) v(input)
union all
select stuff(input, 1, 1, ''),
(case when charindex(left(input, 1),updated) > 0 then updated else concat(updated , left(input, 1)) end),
lev + 1
from cte
where input > ''
)
select top (1) with ties updated
from cte
order by row_number() over (order by lev desc);
修改:
作为用户定义的函数。
CREATE FUNCTION dbo.Fn_Remove(@Input varchar(100))
RETURNS varchar(100)
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret varchar(100)
;with cte as (
select v.input, convert(varchar(max), '') as updated, 1 as lev
from (values (@Input)) v(input)
union all
select stuff(input, 1, 1, ''),
(case when charindex(left(input, 1),updated) > 0 then updated else concat(updated , left(input, 1)) end),
lev + 1
from cte
where input > ''
)
select top (1) @ret=updated
from cte
order by lev desc
RETURN @ret;
END;
答案 3 :(得分:0)
谢谢你们的帮助 但是我需要一个功能 我找到了解决方法
USE [DATAWARHOUSE]
GO
/****** Object: UserDefinedFunction [dbo].[EliminateRedoblons] Script Date: 3/14/2019 1:52:02 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[EliminateRedoblons](@str VARCHAR(500))
RETURNS varchar(500)
begin
DECLARE
@resultat VARCHAR(500)='',
@i INT=0,
@is INT,
@c NVARCHAR(1)
while @i<=LEN(@str)
BEGIN
SET @i=@i+1
SET @c=substring(@str,@i,1)
SET @is =CHARINDEX(@c,@resultat)
IF @IS=0
BEGIN
SET @resultat=@resultat+@c
END
END
return @resultat
END
GO