Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在一行中,找到下一列为空的列_Sql_Sql Server - Fatal编程技术网

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

Sql 在一行中,找到下一列为空的列,sql,sql-server,Sql,Sql Server,所以我需要找出最后一个存在的值,并将该值设置为0。 如果id之外的整行为空,则保持该行不变 例如,输入为: ╔════╦══════╦══════╦══════╦ ║ ID ║ Col1 ║ Col2 ║ Col3 ║ ╠════╬══════╬══════╬══════╬ ║ 1 ║ 100 ║ 100 ║ 100 ║ ║ 1 ║ 20 ║ 200 ║ NULL ║ ║ 1 ║ 30 ║ NULL ║ NULL ║ ║ 1 ║ NULL ║ NULL ║ NULL ║

所以我需要找出最后一个存在的值,并将该值设置为0。 如果id之外的整行为空,则保持该行不变

例如,输入为:

╔════╦══════╦══════╦══════╦
║ 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 ║ 
╚════╩══════╩══════╩══════╩

有一种暴力方式:

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);

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

请尝试以下操作

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
的值


如果您有任何问题或意见,请随时发表相应的意见。

字段的数量是否总是四个(包括
ID
),或者列的数量是否会变化?此外,
ID
的值是否意味着在数据和输出中总是
1
?是否有其他
ID
?如果是这样的话,我们是否应该将输出限制为仅
ID=1
?是否要
更新
选择
?如何确定值的显示顺序?您好,很抱歉回复太晚,所以我更喜欢选择,表中的值来自另一个数据库,它们是这样的。至于ID,它们只是示例,实际上是唯一的标识符