Sql server 条件更新语句T-SQL

Sql server 条件更新语句T-SQL,sql-server,tsql,Sql Server,Tsql,我正在尝试更新SQL中的一个非常宽的表,该表多年来误用了一些列,导致了一些非常混乱的数据。我想写一个条件update语句来将数据从一列转移到另一列,因为它们基本上都是一列,如果它们不为null的话,它们应该是一列 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

我正在尝试更新SQL中的一个非常宽的表,该表多年来误用了一些列,导致了一些非常混乱的数据。我想写一个条件update语句来将数据从一列转移到另一列,因为它们基本上都是一列,如果它们不为null的话,它们应该是一列

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
我如何构造它来有条件地“转移”数据,就像我试图做的那样

示例-数据0始终为空(从未正确使用)

所以数据总是这样:NULL | | ABC | | XHG | XYZ


在本例中,我需要将这些列中的每一列向左移动一行。其中的数据都是VARCHAR。

您只是没有对连接使用正确的语法,并且在每个case之后都缺少一个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?您确定这就是您想要实现的吗?

您只是没有为连接使用正确的语法,并且在每种情况下都缺少结尾:

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在不为null时移动到数据0。好像我错过了什么

您需要使用
data1
的值更新
data0
,而不是相反:

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"
所以我需要数据1在不为null时移动到数据0。好像我错过了什么

您需要使用
data1
的值更新
data0
,而不是相反:

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"
如果你没有很多空值,这可能会更快

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

如果你没有很多空值,这可能会更快

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

试试这个链接:你可以考虑简单地重命名列。如果data0全部为空,则删除列data0,将data1重命名为data0,将data2重命名为data1,等等。假设这些列的名称为
data0
data1
,…,看起来像是您的示例,当发现
null
时,一些答案是将数据向右移动,而不是向左移动。它们也无法传播移动,即,如果一行的
Data1
移动到
Data0
,则
Data1
应设置为
NULL
,以便后续过程可以移动
Data2
,或<代码> DATA2,所有以下列也应该被移动。尝试这个链接:您可以考虑简单地重命名列。如果data0全部为空,则删除列data0,将data1重命名为data0,将data2重命名为data1,等等。假设这些列的名称为
data0
data1
,…,看起来像是您的示例,当发现
null
时,一些答案是将数据向右移动,而不是向左移动。它们也无法传播移动,即,如果一行的
Data1
移动到
Data0
,则
Data1
应设置为
NULL
,以便后续过程可以移动
Data2
,或者
Data2
并且还应该移动以下所有列。如果该列不为null,我需要将其移到左列。此查询将执行以下逻辑:如果data1不为null,则将data0放入其中,否则(如果为null)将data1放入其中(为null)。这是你想要的吗@在本例中,Data0始终为null,因为该列从未使用过。所以我需要数据1在不为null时移动到数据0。似乎我遗漏了什么。如果列不为null,我需要将其移到左列。此查询将执行以下逻辑:如果data1不为null,将data0放入其中,否则(如果为null)将data1放入其中(为null)。这是你想要的吗@在本例中,Data0始终为null,因为该列从未使用过。所以我需要数据1在不为null时移动到数据0。好像我遗漏了什么。例如:数据是scuh NULL | | XYZ | | ABC | | GHA。我希望所有这三个都向左移动,使最右边的列为空而不是空。请更新您的问题,并提供我们理解您的逻辑所需的详细信息!我们不是巫师!示例:数据为scuh NULL | | XYZ | | ABC | | GHA。我希望所有这三个都向左移动,使最右边的列为空而不是空。请更新您的问题,并提供我们理解您的逻辑所需的详细信息!我们不是巫师!