请问以下含CASE WHEN的HQL ORDER BY语句具体含义是什么?
没问题,我来给你把这段HQL的排序逻辑拆解得明明白白:
拆解这段HQL ORDER BY的排序逻辑
这段排序是三层递进的,每一层都是在前一层分组的基础上做进一步排序,默认采用升序(ASC)规则:
第一层:优先区分「有司机」和「无司机」的记录
这里用了一个case条件表达式:case when CAR.DRIVER is null then 1 else 0 end- 如果车辆的
DRIVER字段是null(无司机),表达式返回1 - 如果
DRIVER不为null(有司机),表达式返回0
因为ORDER BY默认升序,0<1,所以所有有司机的记录会排在无司机记录的前面。
- 如果车辆的
第二层:同组内按司机字段排序
当第一层的结果相同时(比如都是有司机的记录,或者都是无司机的),会按照CAR.DRIVER字段的自然顺序排序:- 若为字符串类型,按字母/汉字的字典序升序排列
- 若为数字类型,按数值大小升序排列
第三层:司机相同时按车辆名称排序
当前两层的排序条件完全一致时(比如同一司机名下的多辆车),最后会按照CAR.NAME字段的自然顺序升序排列,确保同一司机的车辆也有明确的排序规则。
举个实际例子更直观:
假设我们有以下4条车辆记录:
| DRIVER | NAME |
|---|---|
| 张三 | 速腾 |
| null | 迈腾 |
| 张三 | 朗逸 |
| 李四 | 帕萨特 |
经过这段ORDER BY排序后,结果顺序会是:
- 张三 - 朗逸(DRIVER非null→0,DRIVER为张三,NAME字典序朗逸在速腾前)
- 张三 - 速腾(DRIVER非null→0,DRIVER为张三,NAME为速腾)
- 李四 - 帕萨特(DRIVER非null→0,DRIVER李四在张三之后)
- null - 迈腾(DRIVER为null→1,排在最后)
内容的提问来源于stack exchange,提问作者Ankur Saran
相关产品推荐
相关产品推荐

