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)
一个非常基本的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)