Tsql T-SQL:基于条件的聚合

Tsql T-SQL:基于条件的聚合,tsql,Tsql,有一张桌子: start | end | zone ------|-----|----- 1 | 5 | 3 3 | 6 | 2 1 | 3 | 1 4 | 7 | 4 开始和结束表示一个范围。我想要一个值为4的区域,比如 declare @value as int = 4 select zone from table where @value >= start and @value <= end ,但我只需要预定义范围中的

有一张桌子:

start | end | zone
------|-----|-----
  1   |  5  |  3
  3   |  6  |  2
  1   |  3  |  1
  4   |  7  |  4
开始和结束表示一个范围。我想要一个值为4的区域,比如

declare @value as int = 4
select zone from table where @value >= start and @value <= end
,但我只需要预定义范围中的一个区域,例如2或3和3具有优先级,因此如果存在2和3,我希望得到3。因此,在我的示例中,区域3是期望的结果


如何解决它?

如果它是硬编码的,您可以执行以下操作:

DECLARE @Value int = 4;

SELECT TOP 1 zone
FROM table
WHERE zone IN (3,2)
AND @Value >= start
AND @Value <= [end] 
ORDER BY CASE WHEN zone = 3 THEN 0 ELSE 1 END
声明@Value int=4;
选择顶部1区域
从桌子上
(3,2)中的何处区域
和@Value>=start
和@Value=start
和@Value=start

和@Value如何确定分区的优先级?如何将优先级分配给分区?换句话说,除了你通知我之外,为什么我知道3是所需的输出?它应该硬编码为if(3个区域存在)return 3 if(2个区域存在)return 2 else return nulls,但它不适用于“else”情况(在我的评论中)。当没有匹配项时,我希望case的结果为null,例如@Value=0。当值超出声明的范围时,case@Value=0仍然不起作用。即使没有值在该范围内的记录,也希望得到null?是。[提交评论的文本]当前不在计算机附近,稍后将再次编辑。
DECLARE @Value int = 4;

SELECT TOP 1 zone
FROM table
WHERE zone IN (3,2)
AND @Value >= start
AND @Value <= [end] 
ORDER BY CASE WHEN zone = 3 THEN 0 ELSE 1 END
SELECT TOP 1 CASE WHEN zone IN (3,2) THEN zone ELSE NULL END AS zone
FROM @T
WHERE @Value >= start
AND @Value <= [end] 
ORDER BY CASE WHEN zone = 3 THEN 0 ELSE 1 END
;WITH CTE AS
(
    SELECT TOP 1 zone
    FROM @T
    WHERE zone IN (3,2)
    AND @Value >= start
    AND @Value <= [end] 
    ORDER BY CASE WHEN zone = 3 THEN 0 ELSE 1 END
)

SELECT zone
FROM CTE
UNION ALL
SELECT NULL
WHERE NOT EXISTS(
    SELECT 1 
    FROM CTE
)