【问题标题】:SQL ORDER BY - how to honour same order as list in WHEN clauseSQL ORDER BY - 如何在 WHEN 子句中遵守与列表相同的顺序
【发布时间】:2021-08-05 09:03:00
【问题描述】:

我忘记了一个非常基本的 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 sql-server sql-order-by


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      在 SQL Server 上,您可以使用 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 值及其映射/排序保存在单独的表中可能更有意义。然后,加入此表并在 ORDER BY 子句中使用排序值。

      【讨论】:

      • 谢谢 - 我应该提到这是 SQL Server,但我收到一个错误:'field' is not a known built-in function name.
      • @Steerpike 是的,你应该提到这一点。我已经更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 2012-04-21
      • 2012-01-28
      • 1970-01-01
      • 2011-10-03
      • 2018-09-09
      • 2022-07-04
      相关资源
      最近更新 更多