关于mysql:为什么Oracle不能通过cluase按顺序选择语句的真实性

Why can Oracle not select truthiness of a statement in the order by cluase

如果我想按一列排序一个表,但从顶部提取一个指定的行,在MySQL中,我可以这样做…(小提琴)

1
2
select * from name
order by surname != 'moon', surname

然而,当我想在Oracle中这样做的时候,ORDERBY子句中的Truthy测试不起作用,我最终不得不做类似的事情……(小提琴)

1
2
select surname from name
order by case when surname = 'moon' then 0 else 1 end, surname

Oracle不支持ORDER BY子句中的Truthy测试的原因是什么?

(或者甚至是与此相关的select语句)

结果

(除浮动到顶部的moon外,其余均按字母顺序排列)

1
2
3
4
5
6
7
SURNAME
moon
adane
bell
day
larkin
williams


我希望答案可以归结为Oracle在SQL中没有boolean数据类型(在pl/sql中有一个布尔值)。表达式a != b必须对布尔值进行计算,而SQL需要能够将其作为第一类数据类型进行处理,以便执行类似于ORDER BY的操作或将其返回到SELECT列表中。

你发表的case声明或同等的DECODE声明可能是你最好的选择。你可以通过创建一个用户定义的布尔类型来实现一些方法,比如对结果进行排序,并使用它来评估你的条件,从而在这里做一些毫无意义的过度杀戮(但可能不是你要解决的实际问题)。但这比你的case语句的代码还要多。