我试图在SQL中更新一个非常宽的表,多年来滥用了几个列,导致一些非常混乱的数据。我想写一个条件更新语句来将数据从一列移到另一列,因为它们基本上都是一列,如果它们不是空的话应该是它们。
UPDATE SOME_TABLE
SET Data1 = (CASE WHEN Data1 IS NOT NULL THEN Data1 = Data0 ELSE Data1),
SET Data2 = (CASE WHEN Data2 IS NOT NULL then Data2 = Data1 ELSE Data2),
SET Data3 = (CASE WHEN Data3 IS NOT NULL then Data3 = Data2 ELSE Data3)
GO
我如何构建这个" shift"有条不紊的数据,正如我想做的那样?
示例 - Data0始终为NULL(从未正确使用过)
所以数据总是这样:NULL || ABC || XHG || XYZ
在这种情况下,我需要在给定的行中将这些列中的每一列向左移动一个。其中的数据都是VARCHAR。
答案 0 :(得分:2)
在每种情况下,您只是没有使用正确的连接语法并且缺少END:
UPDATE SOME_TABLE
SET Data1 = CASE WHEN Data1 IS NOT NULL THEN Data0 ELSE Data1 end,
Data2 = CASE WHEN Data2 IS NOT NULL then Data1 ELSE Data2 end,
Data3 = CASE WHEN Data3 IS NOT NULL then Data2 ELSE Data3 end
虽然此更新没有多大意义..如果列不为null,请更新它,如果它为null,请保持为null?你确定那是你想要达到的目标吗?
答案 1 :(得分:2)
因此,当非空时,我需要数据1移动到数据0。好像我错过了什么
您需要使用data0
的值更新data1
,而不是相反:
UPDATE SOME_TABLE
SET Data0 = CASE WHEN Data1 IS NOT NULL THEN Data0 ELSE Data0 END,
Data1 = CASE WHEN Data2 IS NOT NULL then Data1 ELSE Data1 END,
Data2 = CASE WHEN Data3 IS NOT NULL then Data2 ELSE Data2 END;
根据你的描述,听起来好像根本不需要这个案子。显然,如果data0
为空,您想要移动所有列:
UPDATE SOME_TABLE
SET Data0 = Data1,
Data1 = Data2,
Data2 = Data3
WHERE data0 IS NULL; -- only shift if data0 is "empty"
答案 2 :(得分:0)
UPDATE SOME_TABLE
SET Data1 = isnull(Data1, Data0),
Data2 = isnull(Data2, Data1),
Data3 = isnull(Data3, Data2)
where Data1 is null
or Data2 is null
or Data3 is null
如果你没有很多空值,这可能会更快
UPDATE SOME_TABLE
SET Data1 = Data0
where Data1 is null and Data0 is not null;
UPDATE SOME_TABLE
SET Data2 = Data1
where Data2 is null and Data1 is not null;
UPDATE SOME_TABLE
SET Data3 = Data2
where Data3 is null and Data2 is not null;
如果您背对背null,那么您需要另一种方法,或者您可以多次运行语句