从上面的值填充列值,直到它在SQL Server中达到新值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从上面的值填充列值,直到它在SQL Server中达到新值相关的知识,希望对你有一定的参考价值。
目前,我有一个表格,其值填写如下:
我需要添加一个触发器来填充insert上的值,因此最终结果如下所示:
在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触发器根据上面的文件名和值填充Null值
列值更改的 T-SQL (SQL Server 2016) 触发器,在插入