[英]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.