【问题标题】:compare comma separated values in sql比较sql中的逗号分隔值
【发布时间】:2013-07-15 11:26:15
【问题描述】:

我正在尝试编写一个函数来比较 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 我知道这是错误的

问题:

我想写一个比较逗号分隔值的函数,比较后将取两个值(逗号分隔值),返回值为真或假

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

【问题讨论】:

  • 看看你能不能说出一个明确的问题。一些示例输入和输出有助于澄清您的查询。我知道许多 SO 退伍军人会询问“您尝试过什么”,但这些信息实际上并没有用,所以如果您觉得有必要,请在最后列出。
  • 如果你不太了解 SQL,你应该改变你的数据结构,以便以一种更兼容 SQL 的方式存储字符串(即字符串中每个值一行,多行表示一个字符串)。嗯,即使你很了解 SQL,那也会很有用。
  • 您想要两个 CSV 列表之间的差异或匹配列表吗?
  • 嗨 Kane ...我想在两个 CSV 之间进行匹配,如果任何一个匹配,则返回 true,否则返回 false

标签: sql sql-server sql-server-2008 csv


【解决方案1】:

这是你要找的吗?

真/假结果

-- 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]

返回

Item    Match
val1    0
val2    0
val3    1

只有真正的匹配

-- 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
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;

【讨论】:

  • 我想拆分,比较然后在一个函数中返回真或假我想在存储过程中使用这个函数
  • 我将传递两个参数作为 str1(逗号分隔值)和 str2(逗号分隔值)
  • 嗨 Kane ,感谢您的帮助 ....这将帮助我,但根据我们的要求,我无法修改您的代码,因为我不擅长 SQL ....在我的存储过程中,我必须比较两个 CSV 字符串,如果任何一个匹配,则返回 true 否则返回 false ......所以我想写一个函数......正如我在我的问题中写的那样
  • 这很好用......任何人都可以在 SQL 函数中转换这个 SP 并返回 true 或 false(现在返回匹配的单词)
【解决方案2】:
DECLARE @user_ids NVARCHAR(MAX) = N'203616, 198667, 193718, 188769, 183820, 178871, 173922, 168973, 164024, 159075, 154126, 149177, 144228, 139279, 134330, 129381, 124432, 119483, 114534, 109585, 104636, 99687, 94738, 89789, 84840, 79891, 74942, 69993, 65044, 60095, 55146'
 
DECLARE @sql_xml XML = Cast('<root><U>'+ Replace(@user_ids, ',', '</U><U>')+ '</U></root>' AS XML)
    
SELECT f.x.value('.', 'BIGINT') AS user_id
INTO #users
FROM @sql_xml.nodes('/root/U') f(x)
    
SELECT * 
FROM #users

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2023-03-16
    • 2018-08-30
    相关资源
    最近更新 更多