SQL Server按预定义顺序超额订购

时间:2019-05-23 12:22:35

标签: sql sql-server sql-order-by

我有简单顺序的查询:

SELECT
    ROW_NUMBER() OVER(ORDER BY flagid desc ) as RowNr,
    stepid, flagid
FROM
(
select stepid, flagid
from opstep_flag
where stepid = 262677032
) a

它返回如下数据:

enter image description here

可以订购标记为例如7,5,8的数据吗?

我想在某处定义flagid 7为第一,flagid 5为第二,flagid 8为第三。现在我只能使用asc或desc更改顺序,而5,7,8可以更改为8,7,5。但是我需要有7,5,8。

4 个答案:

答案 0 :(得分:2)

使用ORDER BYCASE表达式,如下所示:

 ORDER BY (CASE flagid WHEN 7 THEN 1 WHEN 5 THEN 2 WHEN 8 THEN 3 ELSE 4 END)

答案 1 :(得分:1)

您可以在CASE子句中使用ORDER BY表达式:

ORDER BY CASE flagid 
          WHEN 7 THEN 1 
          WHEN 5 THEN 2 
          WHEN 8 THEN 3 
          ELSE 4 
        END

答案 2 :(得分:0)

您可以使用case,但我发现派生表可能更易于维护和调试:

select stepid, flagid,
       row_number() over (order by v.ord) as rownr
from opstep_flag f left join
     (values (1, 7), (2, 5), (3, 8)
     ) v(ord, flagid)
     on f.flagid = v.flagid
where f.stepid = 262677032;

请注意,如果您具有规范的顺序,则可以在flagid所引用的引用表中保持该顺序。

此外,此查询也不需要子查询/ CTE。

答案 3 :(得分:0)

要更笼统地回答您的问题(因为我认为您的问题后面还有其他数据),假设您还有另一个带有值的表(表new_order)

FlagId NewFlagOrder
1       7
2       5
3       8

使用

SELECT
ROW_NUMBER() OVER(ORDER BY flagid desc ) as RowNr,
stepid, flagid

FROM
(
select o.stepid, new_order.NewFlagOrder as flagid
from opstep_flag o RIGHT JOIN
     new_order ON o.flagid = new_order.FlagId
where stepid = 262677032
) a