SQL Case语句评估所有条件

时间:2018-11-18 22:29:41

标签: sql sql-server

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

我有一个约有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

1 个答案:

答案 0 :(得分:1)

您可以通过连接字符串并使用 STRING_SPLIT() 函数作为

from Z import Z

Demo

请注意,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),',') 函数仅在2016+版本中可用,因此如果您没有SQL Server 2016或2017,则可以创建自己的函数。