SQL ORDER BY - 如何遵守与 WHEN 子句中的列表相同的顺序

SQL ORDER BY - how to honour same order as list in WHEN clause

一个非常基本的SQL问题我忘记了。

给出

select * from customers
where customer_id in ('29383', '49405', '47483', '10209','46383', '93838');

...如何对结果进行排序,使其按照与 in('... 子句相同的顺序进行排序?

例如,而不是 order by customer_id desc; 我希望结果是:

29383
49405
47483
10209
46383
93838

在 SQL 服务器上,您可以使用 CASE 表达式进行排序:

SELECT *
FROM customers
WHERE customer_id in ('29383', '49405', '47483', '10209','46383', '93838')
ORDER BY CASE customer_id
         WHEN '29383' THEN 1
         WHEN '49405' THEN 2
         WHEN '47483' THEN 3
         WHEN '10209' THEN 4
         WHEN '46383' THEN 5
         WHEN '93838' THEN 6 END;

请注意,如果您一直需要此排序,将此 customer_id 值及其 mappings/orderings 保存在单独的 table 中可能更有意义。然后,加入此 table 并在 ORDER BY 子句中使用排序值。

您可以考虑加入 table value constructor,而不是使用 IN,其中包含不同的 customer_id 列表和排序顺序。

select c.* 
from customers c
join (values(1, '29383'),
            (2, '49405'),
            (3, '47483'),
            (4, '10209'),
            (5, '46383'),
            (6, '93838')) v(pos, customer_id) on v.customer_id = c.customer_id
order by v.pos

或者您可以以类似的方式使用 OPENJSON

SELECT c.*
FROM   customers c
       JOIN OPENJSON('["29383", "49405", "47483", "10209","46383", "93838"]') j
         ON j.[value] = c.customer_id
ORDER  BY CAST(j.[key] AS INT)