我有简单顺序的查询:
SELECT
ROW_NUMBER() OVER(ORDER BY flagid desc ) as RowNr,
stepid, flagid
FROM
(
select stepid, flagid
from opstep_flag
where stepid = 262677032
) a
它返回如下数据:
可以订购标记为例如7,5,8的数据吗?
我想在某处定义flagid 7为第一,flagid 5为第二,flagid 8为第三。现在我只能使用asc或desc更改顺序,而5,7,8可以更改为8,7,5。但是我需要有7,5,8。
答案 0 :(得分:2)
使用ORDER BY
和CASE
表达式,如下所示:
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