【问题标题】:Oracle SQL - Custom SortOracle SQL - 自定义排序
【发布时间】:2021-07-25 03:11:20
【问题描述】:

我有一个场景,我有以下数据:

表格:位置

ID      TYPE
------------------
1000    STORE
11001   STORE
20000   STORE
1181    WAREHOUSE
12002   STORE

我想以一种方式排序,所有以“0000”结尾的 ID 都应该首先排序,然后是 TYPE 'Warehouse',然后是其余的 Stores。

想要的输出应该是这样的

ID      TYPE
------------------
10000   STORE
20000   STORE
1181    WAREHOUSE
11001   STORE
12002   STORE

如何进行这种自定义排序?

【问题讨论】:

  • 。 .您问题中的数据不一致。

标签: sql oracle sorting custom-sort


【解决方案1】:

这就是我理解问题的方式;采样数据直到第 7 行;查询从第 8 行开始。

SQL> with locations (id, type) as
  2    (select 1000 , 'STORE'     from dual union all
  3     select 11001, 'STORE'     from dual union all
  4     select 20000, 'STORE'     from dual union all
  5     select 1181 , 'WAREHOUSE' from dual union all
  6     select 12002, 'STORE'     from dual
  7    )
  8  select id, type
  9  from locations
 10  order by case when substr(to_char(id), -3) = '000' then 1 end,
 11           case when type = 'WAREHOUSE' then 2 end,
 12           type;

        ID TYPE
---------- ---------
      1000 STORE
     20000 STORE
      1181 WAREHOUSE
     12002 STORE
     11001 STORE

SQL>

【讨论】:

    【解决方案2】:

    您可以在排序中使用case 表达式:

    order by (case when id like '%0000' then 1
                   when type = 'WAREHOUSE' then 2
                   else 3
              end), id
    

    这也使用id 在三个组内排序。

    注意:如果id 是数字而不是字符串,我建议:

    order by (case when mod(id, 10000) = 0 then 1
                   when type = 'WAREHOUSE' then 2
                   else 3
              end), id
    

    [由 LF 编辑]

    这是您的 ORDER BY 返回的内容,而这不是 OP 想要的:

    SQL> with locations (id, type) as
      2    (select 1000 , 'STORE'     from dual union all
      3     select 11001, 'STORE'     from dual union all
      4     select 20000, 'STORE'     from dual union all
      5     select 1181 , 'WAREHOUSE' from dual union all
      6     select 12002, 'STORE'     from dual
      7    )
      8  select id, type
      9  from locations
     10  order by (case when id like '%0000' then 1
     11                 when type = 'WAREHOUSE' then 2
     12                 else 3
     13            end), id;
    
            ID TYPE
    ---------- ---------
         20000 STORE
          1181 WAREHOUSE
          1000 STORE
         11001 STORE
         12002 STORE
    
    SQL>
    

    Gordon 的评论:如果 1000 行是 10000,上述应该可以工作。

    【讨论】:

    • 我认为不是;条件应该分开,不能属于同一个CASE。至少,这是我通过使用您的 ORDER BY 发现的。
    • @Littlefoot 。 . .我不明白你的评论。您是否建议按 1、2 和 3 排序不起作用?
    • 戈登,我编辑了你的答案并添加了结果。看一看。当然,随意删除它。
    • @Littlefoot 。 . .我认为这只是问题中数据不一致的问题。这回答了 OP 问的问题;我认为数据是错字。
    猜你喜欢
    • 2014-02-21
    • 2014-04-29
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2014-06-30
    • 2019-12-06
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多