我正在尝试获取范围之间的所有值。我正在做这样的事情
DECLARE @StartSeq INT
set @StartSeq = (select Sequence from MyTbl where ...)
update ... and MyCol between @StartSeq and @StartSeq+@RelativePosition
但是如果RelativePosition是负数,它会失败,因为它的数量比startseq少。我能想到的最简单的解决方案是复制我的代码并执行if(RelPos< 0)以查看我是否想要首先执行@ StartSeq + @ RelativePosition。然而,这似乎不是最好的解决方案。有没有办法在sql中做到这一点?我尝试了min(a,b),但它在sql中不起作用。
答案 0 :(得分:4)
这样的事情可以做到:
update ... and ((MyCol between @StartSeq and @StartSeq+@RelativePosition)
or (MyCol between @StartSeq+@RelativePosition and @StartSeq))
交替:
declare @MinSeq int
declare @MaxSeq int
select @MinSeq = min(Seq), @MaxSeq = max(Seq)
from (values (@StartSeq), (@StartSeq+@RelativePosition)) this (Seq)
update ... and MyCol between @MinSeq and @MaxSeq
答案 1 :(得分:0)
您可以在中间使用CASE
声明,例如
and MyCol Between CASE When @StartSeq <= @relativePosition Then @Start Else @RelativePosition End
And CASE When @StartSeq <= @relativePosition Then @RelativePosition Else @Start End
然而,这是相当讨厌的,你应该尽力确保参数有意义。