我刚刚看到这段代码,对我来说似乎有点脆弱:
String statement = "select * from SOURCE where category = ? order by sub_category desc";
...
List<Source> results = query.list();
/* If we get more than one result return the one with the null sub-category
(the 'order by' should make the first record the one with the null): */
if(results.size() > 0) {
return results.get(0);
}else{
return null;
}
无论如何我会重构它,但我的好奇心被点燃了!
依赖order by子句中的空值排序是否安全?订购数据库是特定的还是有供应商独立的共识?
答案 0 :(得分:4)
空值的排序是特定于数据库的。比方说,MSSQL将空值视为“小于任何其他值”,因此在排序ASC时首先出现空值,如果排序DESC则为空。 Oracle默认将空值视为“大于任何其他值”,但它具有特殊语法,ORDER BY列ASC | DESC NULLS FIRST | LAST,因此开发人员可以显式地将空值放入所需位置。等等。