2013-03-07 114 views
3

我必须包含逗号分隔的字符串变量:如何比较两个逗号分隔的字符串,并返回TRUE,如果至少有1场

@v1 = 'hello, world, one, two' 
@v2 = 'jump, down, yes, one' 

我需要将返回TRUE的功能,如果有至少有一场比赛。所以在上面的例子中,由于值'one'在两个字符串中都会返回TRUE。

这是可能的SQL?

+4

SQL中可能吗?是。你想在SQL中执行此操作吗?可能不会。用逗号分隔的列表,SQL Server不太好。你可以编写一个将列表分割成表格并比较两个表格的函数,但这不是一个很好的解决方案。 – JodyT 2013-03-07 20:26:20

+0

您可以执行SQL CLR函数来解决性能问题。 – 2013-03-07 20:27:33

回答

9

使用分割功能(many examples here - 在大多数情况下,CLR将是您的最佳选择)。

一旦你有一个拆分功能,其余的很容易。该模型将是这样的:

DECLARE @v1 VARCHAR(MAX) = 'hello, world, one, two', 
     @v2 VARCHAR(MAX) = 'jump, down, yes, one'; 

SELECT CASE WHEN EXISTS 
(
    SELECT 1 
    FROM dbo.Split(@v1) AS a 
    INNER JOIN dbo.Split(@v2) AS b 
    ON a.Item = b.Item 
) 
THEN 1 ELSE 0 END; 

你甚至可以把这种减少到仅调用该函数一次:

SELECT CASE WHEN EXISTS 
(
    SELECT 1 FROM dbo.Split(@v1) 
    WHERE ', ' + LTRIM(@v2) + ',' 
    LIKE '%, ' + LTRIM(Item) + ',%' 
) THEN 1 ELSE 0 END; 
1

您可以使用热膨胀系数,以你的字符串分割成XML节点,然后加插转换成表格变量。加入表变量将显示任何匹配

DECLARE @v1 VARCHAR(200) = 'hello, world, one, two' 
DECLARE @v2 VARCHAR(200) = 'jump, down, yes, one' 
DECLARE @v1Words TABLE (word VARCHAR(100)) 
DECLARE @v2Words TABLE (word VARCHAR(100)) 

;WITH cteSplitV1 AS( 
SELECT CAST('<word>' + REPLACE(@v1,', ','</word><word>') + '</word>' AS XML) AS words) 
INSERT INTO @v1Words(word) 
    SELECT word.x.value('.','VARCHAR(100)') AS [word] 
    FROM cteSplitV1 
    CROSS APPLY words.nodes('/word') AS word(x) 

;WITH cteSplitV2 AS( 
SELECT CAST('<word>' + REPLACE(@v2,', ','</word><word>') + '</word>' AS XML) AS words) 
INSERT INTO @v2Words(word) 
    SELECT word.x.value('.','VARCHAR(100)') AS [word] 
    FROM cteSplitV2 
    CROSS APPLY words.nodes('/word') AS word(x) 

SELECT * 
FROM @v1Words v1 
JOIN @v2Words v2 
    ON v1.word = v2.word 
相关问题