【问题标题】: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?

标签: sql-server


【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2012-01-17
      • 2012-10-29
      • 2013-12-14
      • 2019-07-10
      • 2017-04-26
      相关资源
      最近更新 更多