如何在SQL

时间:2016-10-27 09:20:03

标签: sql-server string sql-server-2008 tsql split

我有两个字符串,我希望在SQL中

中获得两个字符串内容的区别

例如,

Declare @String1 as varchar(100)='a,b,c,d,e';

Declare @String2 as varchar(100)='b,e';

现在我希望两个字符串之间的区别为“a,c,d”

4 个答案:

答案 0 :(得分:4)

两个字符串必须分成几个部分。在SQL-Server 2008中,最好使用XML方法。

关注:如果您的数据可能包含<>öä@€&等禁用字符,而不仅仅是您示例中的普通拉丁字符,那么您需要额外的努力......

其余部分非常简单:只需抓取@String1中找不到的@String2的所有部分。

连接结果 - 再次 - 最好通过XML

完成

试试这个:

Declare @String1 as varchar(100)='a,b,c,d,e';

Declare @String2 as varchar(100)='b,e';

WITH FirstStringSplit(S1) AS
(
    SELECT CAST('<x>' + REPLACE(@String1,',','</x><x>') + '</x>' AS XML)
)
,SecondStringSplit(S2) AS
(
    SELECT CAST('<x>' + REPLACE(@String2,',','</x><x>') + '</x>' AS XML)
)

SELECT STUFF(
(
    SELECT ',' + part1.value('.','nvarchar(max)')
    FROM FirstStringSplit
    CROSS APPLY S1.nodes('/x') AS A(part1)
    WHERE part1.value('.','nvarchar(max)') NOT IN(SELECT B.part2.value('.','nvarchar(max)')
                                                  FROM SecondStringSplit 
                                                  CROSS APPLY S2.nodes('/x') AS B(part2)
                                                  ) 
    FOR XML PATH('')

),1,1,'')

答案 1 :(得分:1)

有趣的任务,是业务需求还是其他什么?

Declare @String1 as varchar(100)='a,b,c,d,e';
 SET @String1=REPLACE(@String1,',','')

Declare @String2 as varchar(100)='b,e';
SET @String2=REPLACE(@String2,',','')

;WITH StringOne AS (

     SELECT CAST('' AS VARCHAR(1)) AS ch, 1 as cnt
     UNION ALL
     SELECT CAST(SUBSTRING(@String1,cnt,1) AS VARCHAR(1)) AS ch, cnt+1 as cnt
     FROM StringOne 
     WHERE cnt <= LEN(@String1)
),StringTwo AS (

 SELECT CAST('' AS VARCHAR(1)) AS ch, 1 as cnt
 UNION ALL
 SELECT CAST(SUBSTRING(@String2,cnt,1) AS VARCHAR(1)) AS ch, cnt+1 as cnt
 FROM StringTwo 
 WHERE cnt <= LEN(@String2)
),ExceptOperation AS(

  SELECT ch FROM StringOne
  EXCEPT
  SELECT ch FROM StringTwo
)

SELECT STUFF((SELECT ','+ ch FROM ExceptOperation FOR XML PATH('')),1,1,'') 

答案 2 :(得分:0)

首先从以下链接Parse comma-separated string to make IN List of strings in the Where clause

中获取该功能

然后使用以下查询;

Declare @String1 as varchar(100)='a,b,c,d,e';

Declare @String2 as varchar(100)='b,e';

SELECT
    s1.val
    ,s2.val
FROM [dbo].[f_split](@String1,',') s1
FULL OUTER JOIN [dbo].[f_split](@String2,',') s2
    ON s1.val = s2.val
WHERE s1.val IS NULL
    OR s2.val IS NULL

这会给你以下结果;

val val
a   NULL
c   NULL
d   NULL

答案 3 :(得分:0)

简单方法

declare @string1 varchar(max),@string2 varchar(max)
set @string1='Apple, Orange, Banana'
set @string2='Apple, Orange, Banana, Pinapple, Grapes'

select REPLACE(@String2,@string1,'')

结果

, Pinapple, Grapes