我有一个select查询
select details,* from employeedetails列值可以像‘’非常好,非常好,坏‘。它可以有任意数量的逗号分隔值。
我希望比较每个逗号之间的文本,并删除重复项。
结果需要像‘’很好,坏‘
我怎样才能实现它。请帮帮忙。
提前谢谢。
发布于 2018-12-10 09:32:36
我创建了一个标量值函数fn_RemoveDuplicate,它以varchar作为输入并返回varchar (没有重复)。
然后,您可以使用它作为
从员工中选择dbo.fn_RemoveDuplicate(详细信息),*
Create FUNCTION fn_RemoveDuplicate
(
@inputstring varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
declare @test2 varchar(max)
declare @test1 xml =cast(@inputstring as xml)
SET @test2 ='<Details>'+ cast(('<detail><value1>'+replace(@inputstring,',' ,'</value1></detail><detail><value1>')+'</value1></detail>') as varchar(max))+'</Details>'
set @test1=cast(@test2 as xml)
DECLARE @Details varchar(max)
SET @Details = NULL
SELECT @Details = COALESCE(@Details + ',','') + [value1]
FROM (select distinct
t.x.value('value1[1]','Varchar(50)') as value1
from @test1.nodes('/Details/detail') t(x)) as p
return @Details
END发布于 2018-12-10 09:30:51
如果使用 Server 2016或更高版本的,下面的答案解决了您的问题:
select
e.*,
x.[expected_result]
from
employee e
cross apply
(select
stuff((
select
distinct
','+ltrim(rtrim(value))
from
string_split(e.details, ',')
for xml path(''))
,1 ,1 ,'') as [expected_result]) as x我使用string_split()和stuff()函数来解决这个问题。下面的链接帮助您了解它们是如何工作的:
用逗号分隔的值存储数据不是一个好做法。如果可能的话,我也强烈建议你改变模型。
发布于 2018-12-10 10:44:53
解决方案的思想是使用表值函数(fn_SplitString),并根据不同的值组合生成的表。
下面的查询应该做您想做的事情:
SELECT
[ID],[Details],
[cleansedDetails] = (SELECT
STUFF((
SELECT
DISTINCT ','+LTRIM(RTRIM(ISNULL(ncValue,cvalue)))
FROM
fn_SplitString([Details], ',')
FOR XML PATH(''))
,1 ,1 ,''))
FROM [dbo].[tb_Employee]在这个db<>fiddle中,您可以找到示例数据的DDL & DML和表值函数fn_SplitString的定义。您可以检查代码在不同场景中是如何工作的。
https://stackoverflow.com/questions/53702190
复制相似问题