首页 > 解决方案 > 评估所有条件的 SQL 案例语句

问题描述

所以我有一个有趣的问题,我正在尝试解决并认为你可以提供帮助。

我有一个大约 100 列和大约 100 万条记录的表。我将每周收到一次表的新迭代 - 我想做的是评估从表的迭代到迭代的列更改了哪些数据。请注意,当我得到一个新表时,所有列名都将相同,但数据可能(并且将会)不同。我的目标是通过唯一记录(加入 newtable.id = oldtable.id)创建一个包含从迭代到迭代的所有列的计数表。

我的问题是我的案例陈述。有没有办法让 case 语句评估所有 when 语句并在退出之前执行所有操作?请参阅下面的代码 - 我如何让这个 case 语句插入两个更改的值(也就是我想在 ColumnTEST 下的输出中看到 TEST_A 和 TEST_B。)我知道我必须使它成为动态并为其创建一个游标循环(考虑到大量开销游标,欢迎提出替代建议)但我现在的问题在于案例陈述 - 请帮助我避免大量的联合声明......

谢谢!!

CREATE TABLE #TEST1 (TEST VARCHAR(100), COLUMNTEST VARCHAR(100), id varchar(10))
CREATE TABLE #TEST2 (TEST VARCHAR(100), COLUMNTEST VARCHAR(100),id varchar(10))
CREATE TABLE #TEST3 (COLUMNTEST VARCHAR(100))

INSERT INTO #TEST1(TEST, COLUMNTEST, ID) VALUES ('100','90','1')
INSERT INTO #TEST2(TEST, COLUMNTEST, ID) VALUES ('1000','900','1')

INSERT INTO #TEST3 (COLUMNTEST)
SELECT CASE 
WHEN  #TEST1.COLUMNTEST <> #TEST2.COLUMNTEST THEN 'TEST_A' 
WHEN #TEST1.TEST <> #TEST2.TEST THEN 'TEST_B' END 

FROM #TEST1 
join #test2 
    ON #TEST1.ID = #TEST2.ID

SELECT * FROM #TEST3

DROP TABLE #TEST1
DROP TABLE #TEST2
DROP TABLE #TEST3

标签: sqlsql-server

解决方案


您可以通过连接字符串并使用STRING_SPLIT()函数来做到这一点

INSERT INTO #TEST3 (COLUMNTEST)
SELECT *
FROM STRING_SPLIT((
SELECT CASE 
       WHEN  (#TEST1.COLUMNTEST <> #TEST2.COLUMNTEST AND #TEST1.TEST <> #TEST2.TEST) 
       THEN 'TEST_A,TEST_B'
       WHEN (#TEST1.TEST <> #TEST2.TEST) THEN 'TEST_B' 
       WHEN (#TEST1.COLUMNTEST <> #TEST2.COLUMNTEST) THEN 'TEST_A'
       END
FROM #TEST1 
JOIN #test2 
    ON #TEST1.ID = #TEST2.ID),',')

演示

请注意,该STRING_SPLIT()功能仅适用于 2016+ 版本,因此如果您没有 SQL Server 2016 或 2017,您可以创建自己的功能。


推荐阅读