比较sql中逗号分隔的值

比较sql中逗号分隔的值,sql,sql-server,sql-server-2008,csv,Sql,Sql Server,Sql Server 2008,Csv,我试图编写一个函数来比较SQL中逗号分隔的值 我从互联网上获取了一些代码: SELECT CASE WHEN EXISTS ( SELECT 1 FROM dbo.Split(@v1) WHERE ', ' + LTRIM(@v2) + ',' LIKE '%, ' + LTRIM(Item) + ',%' ) THEN 1 ELSE 0 END; 然后我做一个函数: CREATE FUNCTION [dbo].[fnCompareCSVString] ( @s

我试图编写一个函数来比较SQL中逗号分隔的值 我从互联网上获取了一些代码:

SELECT CASE WHEN EXISTS 
(
  SELECT 1 FROM dbo.Split(@v1)
  WHERE ', ' + LTRIM(@v2) + ',' 
  LIKE '%, ' + LTRIM(Item) + ',%'
) THEN 1 ELSE 0 END;
然后我做一个函数:

CREATE FUNCTION [dbo].[fnCompareCSVString] 
(   
    @str1 nvarchar(50),
    @str2 nvarchar(50)
)

RETURNS  int
AS
BEGIN
    SELECT CASE WHEN EXISTS 
    (
       SELECT 1 FROM dbo.Split(@str1)
       WHERE ', ' + LTRIM(@str2) + ',' 
         LIKE '%, ' + LTRIM(Item) + ',%'
    ) THEN 1 ELSE 0 END;
END
我不擅长SQL,我知道这是错误的

问题: 我想写一个函数来比较逗号分隔的值,它将采用两个值(逗号分隔的值),比较后返回值将为true或false


在这个SQL函数中我必须做哪些更改?

这就是您想要的吗

正确/错误结果

-- matches only those values which exist in both CSV sets
SELECT T1.[Item], CASE  WHEN T2.[Item] IS NULL THEN 0 ELSE 1 END AS [Match] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    LEFT JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]
-- matches only those values which exist in both CSV sets
SELECT T1.[Item] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    INNER JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]
返回

Item    Match
val1    0
val2    0
val3    1
Item
val3
仅真实匹配

-- matches only those values which exist in both CSV sets
SELECT T1.[Item], CASE  WHEN T2.[Item] IS NULL THEN 0 ELSE 1 END AS [Match] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    LEFT JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]
-- matches only those values which exist in both CSV sets
SELECT T1.[Item] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    INNER JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]
返回

Item    Match
val1    0
val2    0
val3    1
Item
val3
分割功能

CREATE FUNCTION [dbo].[Split] 
(   
    @s VARCHAR(max),
    @split CHAR(1)
)
RETURNS @temptable TABLE ([Item] VARCHAR(MAX))    
AS
BEGIN
    DECLARE @x XML

    SELECT @x = CONVERT(xml,'<root><s>' + REPLACE(@s,@split,'</s><s>') + '</s></root>');

    INSERT INTO @temptable          
    SELECT [Value] = T.c.value('.','varchar(20)')
    FROM @X.nodes('/root/s') T(c);
RETURN
END;
创建函数[dbo].[Split]
(   
@s VARCHAR(最大值),
@拆分字符(1)
)
返回@tentable表([Item]VARCHAR(MAX))
作为
开始
声明@x XML
选择@x=CONVERT(xml),+REPLACE(@s,@split,)+“”);
插入@attreable
选择[Value]=T.c.Value('.','varchar(20)')
从@X.nodes('/root/s')T(c);
返回
结束;

看看你是否能说出一个明确的问题。一些输入和输出示例有助于澄清您的查询。我知道很多老兵都会问“你尝试过什么”,但这些信息实际上并不有用,所以如果你觉得有必要,请在最后列出。如果你不太懂SQL,你应该改变数据结构,以便以更兼容SQL的方式存储字符串(即字符串中每个值一行,多行代表一个字符串). 嗯,即使你很了解SQL,那也会很有用。你想要两个CSV列表之间的差异或匹配列表吗?嗨,凯恩…我想要两个CSV之间的匹配如果任何一个匹配,那么返回true,否则返回false我想要分割,比较然后在一个函数中返回true或false我想在存储过程中使用此函数我将传递两个参数,分别为str1(逗号分隔值)和str2(逗号分隔值)。您好,谢谢您的帮助…这将对我有所帮助,但根据我们的要求,我无法修改您的代码,因为我不擅长SQL。。。。在我的存储过程中,我必须比较两个CSV字符串,然后如果任何一个匹配,则返回true else false……因此我想编写一个函数……正如我在问题中所写的,这工作正常……任何一个可以在SQL函数中转换此SP并返回true或false(现在返回匹配字)