如何让orders表中cid为2的所有订单优先展示,其余订单排在后面
问题背景
现有orders表,表结构及示例数据如下:
| OID | CID | ODATE |
|---|---|---|
| 1 | 1 | 01/01/21 |
| 2 | 2 | 01/02/21 |
| 3 | 2 | 20/01/21 |
| 4 | 3 | 20/01/21 |
| 5 | 4 | 20/01/21 |
需求为查询时优先展示所有CID为2的订单,其余订单排在后面。
实现方法
核心思路是在ORDER BY子句中自定义排序权重,给CID为2的记录分配更小的排序值即可实现优先级排序。
全数据库通用写法
使用CASE WHEN表达式定义排序权重,兼容所有主流SQL数据库(MySQL、PostgreSQL、Oracle、SQL Server等):
SELECT OID, CID, ODATE FROM orders ORDER BY CASE WHEN CID = 2 THEN 0 ELSE 1 END ASC, -- 优先排序CID=2的记录 OID ASC; -- 同优先级下可自定义其他排序规则,此处示例按订单ID升序
写法说明
CASE WHEN CID = 2 THEN 0 ELSE 1 END会为所有CID=2的记录生成排序值0,其余记录生成排序值1,按该值升序排序时,0值记录会全部排在1值记录之前- 你可以根据业务需求追加其他排序规则,比如同优先级下按订单日期
ODATE排序、按OID倒序等,直接在ORDER BY后追加对应字段即可
MySQL专属简化写法
MySQL支持直接对布尔表达式的返回结果排序,可简化写法:
SELECT * FROM orders ORDER BY (CID != 2) ASC, OID ASC;
写法说明
MySQL中布尔表达式判断为真时返回1,判断为假时返回0:当CID=2时CID !=2的结果为0,其余情况为1,升序排序即可实现CID=2的记录优先展示。
内容的提问来源于stack exchange,提问作者TechMan
相关产品推荐
相关产品推荐

