如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]

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

【讨论】:

以上是关于如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何查找自多少天以来列的值为True?

Mysql如何更新字段值

如果值为空,则在 SQL 中生成一个新列,该列显示前一个单元格中的值

fastreport 如何统计某列的值为20的数据有多少行

如何获得DataGridView中某一列中全部的值?

MERGE - 有条件的“当匹配然后更新”