比较2列与SQL Server 2012中的csv值

时间:2018-08-07 22:26:02

标签: sql-server csv sql-server-2012

如何比较SQL Server 2012中存储csv值的这两列?我想返回常见的值。

column1 - 2,3,4,5
column2 - 4,5,6

查询是否应返回4,5或至少一个布尔值,无论它们是否具有相同的值。

我尝试使用xquery,但无法正常工作

1 个答案:

答案 0 :(得分:0)

解决方案很明确。您需要拆分值,然后使用一种技术来匹配相同的值。

为了分割值,我正在使用将它们转换为XML,然后使用nodes()。这是一项旧技术,适用于所有SQL Server版本。无论如何,我建议(如果无法升级到SQL Server 2016 +并使用STRING_SPLIT)来检查并尝试实现this SQL CLR功能包-这将使编码更加容易和清晰。 / p>

DECLARE @column1 VARCHAR(MAX)
       ,@column2 VARCHAR(MAX);

SELECT @column1 = '2,3,4,5'
      ,@column2 = '4,5,6';


WITH CTE([column1], [column2])
AS
(
    -- this can be replaced with your actual query selecting data from the table
    SELECT  CAST(N'<r><![CDATA[' + REPLACE(@column1, ',', ']]></r><r><![CDATA[') + ']]></r>' AS XML)
           ,CAST(N'<r><![CDATA[' + REPLACE(@column2, ',', ']]></r><r><![CDATA[') + ']]></r>' AS XML)

)
SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)'))) AS Code 
FROM CTE
CROSS APPLY [column1].nodes('//r') Tbl(Col)
INTERSECT 
SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)'))) AS Code 
FROM CTE
CROSS APPLY [column2].nodes('//r') Tbl(Col);

enter image description here

我正在使用INTERSECT,但是您也可以使用INNER JOIN