如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]
Posted
技术标签:
【中文标题】如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]【英文标题】:how to update the values of a column in a single query if the value is null then update with the previous not null value [duplicate] 【发布时间】:2015-04-18 05:31:08 【问题描述】:我有表Salesorder
,表的结构是这样的。
Create table Salesorder(SOID int identity, quantity numeric(18,2))
表中的数值如下所述。
insert into Salesorder values(100)
insert into Salesorder values(Null)
insert into Salesorder values(200)
insert into Salesorder values(300)
insert into Salesorder values(Null)
insert into Salesorder values(Null)
insert into Salesorder values(500)
insert into Salesorder values(Null)
所以,我想以这种方式更新这个表,这样如果我执行选择查询,我应该会找到下面的结果。
预期输出:
100
100
200
300
300
300
500
500
这意味着所有的空值都应该用之前的非空值更新。
【问题讨论】:
嗨,Ameya,这也对我没有帮助。请帮忙。 你用的是哪个版本的sqlserver? 【参考方案1】:这是工作声明:
Update so1
Set quantity = (select top 1 quantity
from Salesorder so2
where so2.quantity is not null and
so2.SOID < so1.SOID
order by SOID desc)
From Salesorder so1
Where quantity is null;
小提琴http://sqlfiddle.com/#!6/5a643/30
【讨论】:
【参考方案2】:此查询将按预期UPDATE
,
UPDATE Salesorder1 SET Salesorder1.quantity =
CASE WHEN Salesorder1.quantity IS NULL
THEN (
SELECT TOP 1 SalesOrder2.quantity
FROM Salesorder AS SalesOrder2
WHERE
SalesOrder2.quantity IS NOT NULL AND
SalesOrder2.SOID < SalesOrder1.SOID
ORDER BY SalesOrder2.SOID DESC
)
END
FROM Salesorder AS SalesOrder1
WHERE SalesOrder1.quantity IS NULL
CASE
声明
SalesOrder2.quantity IS NOT NULL
AND SalesOrder2.SOID < SalesOrder1.SOID
ORDER BY SalesOrder2.SOID DESC
将NULL
值替换为前一个值,WHERE
子句以降序给出NOT NULL
值。
【讨论】:
它会起作用,但 case 语句在这里没有意义。为什么要更新非空值? @GiorgiNakeuri 是的,你是对的。我已修改答案以仅更新NULL
记录。【参考方案3】:
如果你想在你的插入语句中获取之前的值:
INSERT INTO SalesOrder
VALUES (ISNULL(?, (
SELECT quantity
FROM SalesOrder s
WHERE s.SOID = (SELECT MAX(si.SOID)
FROM SalesOrder si))
【讨论】:
以上是关于如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]的主要内容,如果未能解决你的问题,请参考以下文章