【问题标题】:Update a table using a case expression when the results are NULL?当结果为 NULL 时使用 case 表达式更新表?
【发布时间】:2020-02-20 01:04:21
【问题描述】:

我创建了一个帮助临时表来存储查询结果。有时,此查询会返回 1、2 或 3 行。如果表中有数据,我需要使用它来将不同的表更新为这些值。如果根本没有结果只有 1 或 2 行,我需要将值设置为其他值。

我无法设置此查询。

当辅助表中没有数据时,我需要它做的是将#ForExcel 中的 NULL 更改为空白值 ('')。在我的第一种情况下,#ForExcel.ExcelRow=15 和 16 ColumnF 都应该是 ''(不是 NULL)。

在我的第二种情况下,只有 #ForExcel.ExcelRow=16 应该是 ''(不是 NULL)

目前为止

CREATE TABLE #ForExcel (ExcelRow int, ColumnE varchar(max), ColumnF varchar(max))
DECLARE @i int=1
 WHILE @i <=16
     BEGIN
        INSERT INTO #ForExcel VALUES (@i, NULL, NULL)
        SELECT @i=@i+1
     END

CREATE TABLE #rpoB_helper (RowNumber int, MyDesiredValue varchar(max))
INSERT INTO #rpoB_helper VALUES (1, 'MyValue')

UPDATE #ForExcel SET ColumnE='rpoB',    ColumnF=(CASE WHEN MyDesiredValue IS  NULL THEN 'NA' ELSE         MyDesiredValue END) FROM #rpoB_helper rh  WHERE  RowNumber=1 AND  ExcelRow=14 
UPDATE #ForExcel SET ColumnE='',          ColumnF=(CASE WHEN MyDesiredValue IS NULL  THEN ''       ELSE MyDesiredValue END) FROM #rpoB_helper rh WHERE  RowNumber=2 AND  ExcelRow=15 
UPDATE #ForExcel SET ColumnE='',          ColumnF=(CASE WHEN MyDesiredValue IS NULL  THEN ''       ELSE MyDesiredValue END) FROM #rpoB_helper rh WHERE   RowNumber=3 AND   ExcelRow=16 

SELECT * FROM #ForExcel

--now add a row to see with two rows
INSERT INTO #rpoB_helper VALUES (2, 'AnotherValue')   

UPDATE #ForExcel SET ColumnE='rpoB',    ColumnF=(CASE WHEN MyDesiredValue IS  NULL THEN 'NA' ELSE MyDesiredValue END) FROM #rpoB_helper rh  WHERE  RowNumber=1 AND  ExcelRow=14 
UPDATE #ForExcel SET ColumnE='',          ColumnF=(CASE WHEN MyDesiredValue IS NULL  THEN ''       ELSE MyDesiredValue END) FROM #rpoB_helper rh WHERE  RowNumber=2 AND  ExcelRow=15 
UPDATE #ForExcel SET ColumnE='',          ColumnF=(CASE WHEN MyDesiredValue IS NULL  THEN ''       ELSE MyDesiredValue END) FROM #rpoB_helper rh WHERE   RowNumber=3 AND   ExcelRow=16 

SELECT * FROM #ForExcel

【问题讨论】:

  • 这里的六个更新语句中只有三个会做任何事情。第一组更新中的第一个。第二个和第三个不做任何事情,因为 #rpoB_helper 中没有满足 where 谓词的行。由于没有行满足谓词更新触发,您会看到 0 行受到影响。
  • 不太确定您期望在这里发生什么。也许对预期结果的解释会使这一点更清楚。
  • 我将问题编辑得更清楚。当没有行满足条件时,我想将 NULL 更新为 ''

标签: sql-server tsql sql-update case


【解决方案1】:

您需要在更新语句中使用 join 才能按您想要的方式工作。这样的事情应该可以让你指向正确的方向。

UPDATE e SET 
    ColumnE = case when rh.RowNumber is null then '' else 'rpoB' end
    , ColumnF = CASE WHEN rh.RowNumber IS NULL THEN '' ELSE rh.MyDesiredValue END
FROM #ForExcel e
left join #rpoB_helper rh on rh.RowNumber = e.ExcelRow

【讨论】:

  • 此方法有效,除非 #rpoB_helper 中没有任何内容。有时,辅助表没有任何数据,因为插入辅助表的查询没有任何结果。当辅助表中没有任何内容时,有没有办法更新 NULL?
  • 这将更新 #ForExcel 表中的任何行,即使辅助表中没有行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2014-12-06
  • 2015-09-10
相关资源
最近更新 更多