ORDER BY 中的 HQL 案例未正确排序
HQL case in ORDER BY not sorting correctly
我有一个 HQL,我可以选择按 "studentNumber" 或其名称来订购。
String orderBy = orderByNumber
? "(case when e.studentNumber is null then e.student.name else e.studentNumber end)" : "e.student.name";
但是当我选择 studentNumber 并且它为空时,我应该按姓名排序。为此,我使用了:
(case when e.studentNumber is null then e.student.name else e.studentNumber end)
这很好用,但是当我有超过 10 个学生时,顺序是这样的:
1
10
11
12
2
3
4
5
6
7
8
9
studentNumber
在数据库和实体中设置为 Integer。我想如果它被认为是一个字符串就会发生这种情况。
谢谢
编辑 1 我尝试了这个新查询:
(case when (case when e.studentNumber is null then e.student.name else e.studentNumber end) = e.studentNumber then cast(e.studentNumber as int) end)
现在它可以正确排序,但是当 e.studentNumber 为 null 时,不是按名称排序。如果我添加 then 并试试这个:
(case when (case when e.studentNumber is null then e.student.name else e.studentNumber end) = e.studentNumber then cast(e.studentNumber as int) else e.student.name end)
第一个问题死而复生变成僵尸(1,10,2,3)...
编辑 2
我也试过合并:
(case when coalesce(e.studentNumber, e.student.name) = e.studentNumber then cast(e.studentNumber as int) else e.student.name end)
同上,两种情况。
我认为这是一个 sql 错误。在 "Case" 中,您返回两种不同的数据类型,sql 自动转换数字类型以满足某种逻辑。
我尝试在 oracle 数据库中做一些类似的事情,但它导致了一个错误,指出返回的数据类型不同。
你应该试着改变你的要求。如果 studentNumber 不为空,也许您可以尝试将结果转换为数字
编辑 1:
symply 使用
之类的东西怎么样
ORDER BY e.studentNumber NULLS LAST, e.student.name NULLS LAST
我有一个 HQL,我可以选择按 "studentNumber" 或其名称来订购。
String orderBy = orderByNumber
? "(case when e.studentNumber is null then e.student.name else e.studentNumber end)" : "e.student.name";
但是当我选择 studentNumber 并且它为空时,我应该按姓名排序。为此,我使用了:
(case when e.studentNumber is null then e.student.name else e.studentNumber end)
这很好用,但是当我有超过 10 个学生时,顺序是这样的:
1
10
11
12
2
3
4
5
6
7
8
9
studentNumber
在数据库和实体中设置为 Integer。我想如果它被认为是一个字符串就会发生这种情况。
谢谢
编辑 1 我尝试了这个新查询:
(case when (case when e.studentNumber is null then e.student.name else e.studentNumber end) = e.studentNumber then cast(e.studentNumber as int) end)
现在它可以正确排序,但是当 e.studentNumber 为 null 时,不是按名称排序。如果我添加 then 并试试这个:
(case when (case when e.studentNumber is null then e.student.name else e.studentNumber end) = e.studentNumber then cast(e.studentNumber as int) else e.student.name end)
第一个问题死而复生变成僵尸(1,10,2,3)...
编辑 2
我也试过合并:
(case when coalesce(e.studentNumber, e.student.name) = e.studentNumber then cast(e.studentNumber as int) else e.student.name end)
同上,两种情况。
我认为这是一个 sql 错误。在 "Case" 中,您返回两种不同的数据类型,sql 自动转换数字类型以满足某种逻辑。 我尝试在 oracle 数据库中做一些类似的事情,但它导致了一个错误,指出返回的数据类型不同。 你应该试着改变你的要求。如果 studentNumber 不为空,也许您可以尝试将结果转换为数字
编辑 1: symply 使用
之类的东西怎么样ORDER BY e.studentNumber NULLS LAST, e.student.name NULLS LAST