条件更新语句T-SQL

时间:2016-03-06 09:41:29

标签: sql-server tsql

我试图在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。

3 个答案:

答案 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,那么您需要另一种方法,或者您可以多次运行语句