从上面的值填充列值,直到它在SQL Server中达到新值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从上面的值填充列值,直到它在SQL Server中达到新值相关的知识,希望对你有一定的参考价值。

目前,我有一个表格,其值填写如下:

Current Table

我需要添加一个触发器来填充insert上的值,因此最终结果如下所示:

End Goal

在excel中的过程类似于您向下拖动值。但我需要它在它达到新值之前停止,然后重新开始这个过程。

但是,有时可能没有下一个值。如果没有结束,我将如何停止更新?

答案

您可以使用两个相关的子查询来完成此操作。

create table #YourTable (RowNumber int identity(1,1), [Value] int null)
insert into #YourTable 
values
(10),
(null),
(null),
(null),
(null),
(null),
(null),
(null),
(20),
(null),
(null),
(null),
(null),
(30),
(null),
(40),
(null),
(null),
(50)


select 
    t.RowNumber
    ,OldVal =   t.Value
    ,NewVal =   case 
                    when t.[Value] is null 
                        then (select t3.[Value] 
                              from #YourTable t3 
                              where t3.RowNumber = (select max(RowNumber) 
                                                    from #YourTable t2 
                                                    where t2.RowNumber < t.RowNumber and t2.Value is not null)
                             ) 
                    else [Value] 
                end
from #YourTable t
order by
    t.RowNumber

drop table #YourTable

如果您要更新表格,请按以下步骤操作(新测试数据)。

create table #YourTable (RowNumber int identity(1,1), [Value] int null)
insert into #YourTable 
values
(10),
(null),
(null),
(null),
(5),
(null),
(null),
(null),
(20),
(null),
(15),
(null),
(null),
(30),
(null),
(40),
(null),
(null),
(50),
(null),
(null)

update t
set  [Value] =  case 
                    when t.[Value] is null 
                        then (select t3.[Value] 
                              from #YourTable t3 
                              where t3.RowNumber = (select max(RowNumber) 
                                                    from #YourTable t2 
                                                    where t2.RowNumber < t.RowNumber and t2.Value is not null)
                             ) 
                    else [Value] 
                end
from #YourTable t


select * from #YourTable order by RowNumber

一旦更新了表,那么insert语句只需要检查是否插入IS NULL的值,如果是,则将其设置为最后一个值。那会是这样的......

这里我们插入一个NULL,因此插入的值实际上将基于最后一个测试表50

declare @valToInsert int = null
insert into #YourTable
select case when @valToInsert is null then (select top 1 [Value] from #YourTable order by RowNumber desc) else @valToInsert end

然后,由于我们没有在下面插入NULL,它将插入实际值

declare @valToInsert int = 14
insert into #YourTable
select case when @valToInsert is null then (select top 1 [Value] from #YourTable order by RowNumber desc) else @valToInsert end

以上是关于从上面的值填充列值,直到它在SQL Server中达到新值的主要内容,如果未能解决你的问题,请参考以下文章

将表列值存储到变量中(SQL Server)

根据列值返回 SQL Server 列名和对应值

SQL Server触发器根据上面的文件名和值填充Null值

列值更改的 T-SQL (SQL Server 2016) 触发器,在插入

使用 C# 在 ASP.NET 中检查 SQL Server 表中的列值是不是为空

SQL - 在填充另一列时继承派生列值