SQL Server по порядку с предопределенным порядком - PullRequest
2 голосов
/ 23 мая 2019

У меня есть запрос с простым заказом:

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

Это возможноупорядочить данные, что у flagid будет например 7,5,8?

Я хочу определить где-то, что flagid 7 - первый, flagid 5 - второй, а flagid 8 - третий.Теперь я могу изменить заказ только с помощью asc или desc, а 5,7,8 я могу изменить на 8,7,5.Но мне нужно 7,5,8.

Ответы [ 4 ]

2 голосов
/ 23 мая 2019

Используйте выражение ORDER BY с CASE, как показано ниже:

 ORDER BY (CASE flagid WHEN 7 THEN 1 WHEN 5 THEN 2 WHEN 8 THEN 3 ELSE 4 END)
1 голос
/ 23 мая 2019

Вы можете использовать выражение CASE в предложении ORDER BY:

ORDER BY CASE flagid 
          WHEN 7 THEN 1 
          WHEN 5 THEN 2 
          WHEN 8 THEN 3 
          ELSE 4 
        END
0 голосов
/ 23 мая 2019

Чтобы ответить на ваш вопрос более широко (поскольку я думаю, что за вашим вопросом скрываются другие данные), предположим, что у вас есть другая таблица (таблица new_order) со значениями

FlagId NewFlagOrder
1       7
2       5
3       8

use

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
0 голосов
/ 23 мая 2019

Вы можете использовать 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 не требуется для этого запроса.

...