如果值为null,则如何更新单个查询中的列值,然后使用先前的非null值进行更新

时间:2015-04-18 05:31:08

标签: sql-server

我有表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)

所以,我想以这种方式更新这个表,这样如果我执行select查询,我应该找到下面的结果。

预期产出:

100
100
200
300
300
300
500
500

这意味着应使用先前的非空值更新所有空值。

3 个答案:

答案 0 :(得分:3)

这是工作声明:

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

答案 1 :(得分:1)

此查询将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值。

答案 2 :(得分:0)

如果您想在insert语句中获取先前的值:

INSERT INTO SalesOrder 
VALUES (ISNULL(?, (
    SELECT quantity
    FROM SalesOrder s
    WHERE s.SOID = (SELECT MAX(si.SOID)
                    FROM SalesOrder si))