Sql server 从sql server中的给定字符串中获取不同的字符
我需要一个T-SQL函数来删除给定字符串中的重复字符 例如,Fn_删除“AVGHAHA” 它将返回AVGH使用,您可以将字符串拆分为单个字符标记,对该字符集应用一个数字,然后仅使用每个字符的第一个重建:Sql server 从sql server中的给定字符串中获取不同的字符,sql-server,string,function,tsql,Sql Server,String,Function,Tsql,我需要一个T-SQL函数来删除给定字符串中的重复字符 例如,Fn_删除“AVGHAHA” 它将返回AVGH使用,您可以将字符串拆分为单个字符标记,对该字符集应用一个数字,然后仅使用每个字符的第一个重建: WITH CTE AS( SELECT V.S, N.position, N.token, ROW_NUMBER() OVER (PARTITION BY N.token ORDER BY N.position) AS R
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向上递增 然后你可以用
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\u AGG,则可以使用XML路径进行字符串连接。另一种方法可以使用递归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;
谢谢你们的帮助 但我需要一个函数 我找到了解决办法
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
您可能需要编写一个UDF来处理此问题。我不确定SQL Server开箱即用中的任何东西是否有帮助。到目前为止,您尝试了什么?Stack overflow不是一个说明您需要什么的网站,而是一个询问编码问题的网站。你想分开处理大写和小写字符吗?看看这个链接:a也是一个重复字符,为什么不从你的示例中删除它?我相信重复字符是指第二次或更多次出现的字符@GuidoG。请注意,第一个A出现在字符串的开头,就像位置4中的第一个H一样,后面出现的任何字符都不会出现。它工作得很好,现在我正在努力将其添加到函数中,正如我所说的我是新的this@yassinemhadhbi,我已将其创建为函数,您可以检查答案。