Sql 在一行中,找到下一列为空的列
所以我需要找出最后一个存在的值,并将该值设置为0。 如果id之外的整行为空,则保持该行不变 例如,输入为: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 ║
╔════╦══════╦══════╦══════╦
║ 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,它们只是示例,实际上是唯一的标识符