SQL查询:当值超出范围时默认返回表中最后一行数据的实现
解决方案
可以通过两种简洁的方式实现需求,同时注意FROM、TO、MAX是SQL关键字,必须用方括号[]转义避免语法错误:
方法一:UNION ALL 结合存在性判断
先查询匹配范围的行,若没有匹配结果,则返回表中ID最大的行(即目标最后一行):
DECLARE @VAL DECIMAL(6,2); SET @VAL = 695.43; SELECT ID, [FROM], [TO], [MAX] FROM [MyTable].[dbo].[MagicPlan] WHERE @VAL BETWEEN [FROM] AND [TO] UNION ALL SELECT ID, [FROM], [TO], [MAX] FROM [MyTable].[dbo].[MagicPlan] WHERE NOT EXISTS ( SELECT 1 FROM [MyTable].[dbo].[MagicPlan] WHERE @VAL BETWEEN [FROM] AND [TO] ) ORDER BY ID DESC OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
方法二:TOP 1 结合排序优先级
通过CASE语句给匹配行更高的排序优先级,无匹配时按ID倒序取第一行,实现逻辑更紧凑:
DECLARE @VAL DECIMAL(6,2); SET @VAL = 695.43; SELECT TOP 1 ID, [FROM], [TO], [MAX] FROM [MyTable].[dbo].[MagicPlan] ORDER BY CASE WHEN @VAL BETWEEN [FROM] AND [TO] THEN 1 ELSE 2 END, ID DESC;
补充说明
如果业务中“最后一行”的定义是TO字段值最大的行,只需将排序条件中的ID DESC替换为[TO] DESC即可。
内容的提问来源于stack exchange,提问作者GCDevOps
相关产品推荐
相关产品推荐

