首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server :比较相同的字符串

Server :比较相同的字符串
EN

Stack Overflow用户
提问于 2018-12-10 08:51:40
回答 3查看 87关注 0票数 0

我有一个select查询

代码语言:javascript
运行
复制
select details,* from employee

details列值可以像‘’非常好,非常好,坏‘。它可以有任意数量的逗号分隔值。

我希望比较每个逗号之间的文本,并删除重复项。

结果需要像‘’很好,坏‘

我怎样才能实现它。请帮帮忙。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-10 09:32:36

我创建了一个标量值函数fn_RemoveDuplicate,它以varchar作为输入并返回varchar (没有重复)。

然后,您可以使用它作为

从员工中选择dbo.fn_RemoveDuplicate(详细信息),*

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-12-10 09:30:51

如果使用 Server 2016或更高版本的,下面的答案解决了您的问题:

代码语言:javascript
运行
复制
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()函数来解决这个问题。下面的链接帮助您了解它们是如何工作的:

拆分(Transact-SQL)

(Transact-SQL)

SQL Server交叉应用和外部应用

用逗号分隔的值存储数据不是一个好做法。如果可能的话,我也强烈建议你改变模型。

票数 1
EN

Stack Overflow用户

发布于 2018-12-10 10:44:53

解决方案的思想是使用表值函数(fn_SplitString),并根据不同的值组合生成的表。

下面的查询应该做您想做的事情:

代码语言:javascript
运行
复制
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的定义。您可以检查代码在不同场景中是如何工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53702190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档