简体   繁体   English

Oracle SQL - 自定义排序

[英]Oracle SQL - Custom Sort

I have a scenario where I have following data:我有一个场景,我有以下数据:

Table: Locations表:位置

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

I want to sort in a way that all the IDs that end in '0000' should be sorted first, then the TYPE 'Warehouse' and then the rest of the Stores.我想以一种方式排序,所有以“0000”结尾的 ID 都应该首先排序,然后是类型“仓库”,然后是商店的 rest。

The desired output should be like所需的 output 应该像

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

How do I do this custom sorting?我该如何进行这种自定义排序?

You can use a case expression in sorting:您可以在排序中使用case表达式:

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

This also uses id to sort within the three groups.这也使用id在三个组中进行排序。

Note: If id is a number and not a string, I would suggest:注意:如果id是数字而不是字符串,我建议:

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

[EDITED by LF] [由 LF 编辑]

This what your ORDER BY returns, and that's not what the OP wanted:这是您的 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>

Comment by Gordon: The above should work if the 1000 row is 10000. Gordon 的评论:如果 1000 行是 10000,上面应该可以工作。

This is how I understood the problem;这就是我理解问题的方式; sample data till line #7;采样数据直到第 7 行; query begins at line #8.查询从第 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM