【问题标题】:Compare 2 columns with csv values in SQL Server 2012将 2 列与 SQL Server 2012 中的 csv 值进行比较
【发布时间】:2018-08-07 22:26:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是说该列将这些值存储在逗号分隔列表中吗?这违背了规范化和 SQL Server 的设计。为此,您将需要一个拆分器功能。

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


【解决方案1】:

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

为了拆分值,我将它们转换为 XML,然后使用 nodes()。这是适用于所有 SQL Server 版本的旧技术。无论如何,我建议(如果不能升级到 SQL Server 2016 + 并使用STRING_SPLIT)检查并尝试实现this SQL CLR 函数包 - 它将使编码更容易和更清晰。

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

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

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 2016-04-18
    • 2012-04-29
    • 2021-02-22
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多