所以我需要找出最后一个现有值,并将该值设置为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 :(得分: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
的值。
如果您有任何问题或意见,请随时发表评论。