2017-04-15 33 views
0

因此,我需要找出最后一个现有值,并将该值设置为0. 如果id外部的整行是Null,排完好。在一行中找到下一列为空的列

因此,例如输入是:

╔════╦══════╦══════╦══════╦ 
║ ID ║ Col1 ║ Col2 ║ Col3 ║ 
╠════╬══════╬══════╬══════╬ 
║ 1 ║ 100 ║ 100 ║ 100 ║ 
║ 1 ║ 20 ║ 200 ║ NULL ║ 
║ 1 ║ 30 ║ NULL ║ NULL ║ 
║ 1 ║ NULL ║ NULL ║ NULL ║ 
╚════╩══════╩══════╩══════╩ 

我要处理的行返回:

╔════╦══════╦══════╦══════╦ 
║ ID ║ Col1 ║ Col2 ║ Col3 ║ 
╠════╬══════╬══════╬══════╬ 
║ 1 ║ 100 ║ 100 ║ 0 ║ 
║ 1 ║ 20 ║ 0 ║ NULL ║ 
║ 1 ║ 0 ║ NULL ║ NULL ║ 
║ 1 ║ NULL ║ NULL ║ NULL ║ 
╚════╩══════╩══════╩══════╩ 
+0

字段的数量总是可以是四个(包括'ID')还是列数会变化? – toonice

+0

另外,在您的数据和输出中,“ID”的值是否总是为1?还有其他的'ID'吗?如果是这样,我们是否应该将输出限制为“ID = 1”? – toonice

+0

你想要更新或选择吗? –

回答

0

请尝试以下...

SELECT ID, 
     CASE 
      WHEN Col1 IS NULL THEN 
       NULL 
      WHEN Col2 IS NULL THEN 
       0 
      ELSE 
       Col1 
     END AS Col1, 
     CASE 
      WHEN Col2 IS NULL THEN 
       NULL 
      WHEN Col3 IS NULL THEN 
       0 
      ELSE 
       Col2 
     END AS Col2, 
     CASE 
      WHEN Col3 IS NULL THEN 
       NULL 
      ELSE 
       0 
     END AS Col3 
FROM tblTable; 

我测试了上述反对使用下面的脚本创建了一个样本数据集...达到

CREATE TABLE tblTable 
(
    ID  INT, 
    Col1 INT, 
    Col2 INT, 
    Col3 INT 
); 
INSERT INTO tblTable (ID, 
         Col1, 
         Col2, 
         Col3) 
VALUES (1, 100, 100, 100), 
     (1, 20, 200, NULL), 
     (1, 30, NULL, NULL), 
     (1, NULL, NULL, NULL); 

所需的输出。

我使用的逻辑是,如果Col的值是NULL那么它应该在输出中保持不变。否则,如果下一个Col的值是NULL,那么已找到该记录的最后一个现有值,并且应在输出中设置为0。否则,正在检查的Col不是最后一个现有值,因此在输出中应保持不变。

随着最后的Col你不需要测试下一个Col的价值会是什么。

如果您有任何问题或意见,请随时发表评论。

0

有蛮力方式:

update t 
    set col1 = (case when col1 is not null and col2 is null and col3 is null then 0 else col1 end), 
     col2 = (case when col1 is not null and col2 is not null and col3 is null then 0 else col2 end), 
     col3 = (case when col1 is not null and col2 is not null and col3 is not null then 0 else col3); 

然而,需要这样做表明这些栏目是相互关联的。反过来,这表明这些值应该存储在单独的行而不是单独的列中。

相关问题