在一行中,找到下一列为空的列

时间:2017-04-15 00:17:57

标签: sql sql-server

所以我需要找出最后一个现有值,并将该值设置为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 ║ 
╚════╩══════╩══════╩══════╩

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分: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的值。

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