Why can Oracle not select truthiness of a statement in the order by cluase
如果我想按一列排序一个表,但从顶部提取一个指定的行,在MySQL中,我可以这样做…(小提琴)
然而,当我想在Oracle中这样做的时候,ORDERBY子句中的Truthy测试不起作用,我最终不得不做类似的事情……(小提琴)
Oracle不支持ORDER BY子句中的Truthy测试的原因是什么?
(或者甚至是与此相关的select语句)
结果
(除浮动到顶部的moon外,其余均按字母顺序排列)
1 2 3 4 5 6 7
| SURNAME
moon
adane
bell
day
larkin
williams |
- 只是一个附带问题——要对布尔值进行排序,您需要回答更高的问题:"真"或"假"?:)
- 好吧,作为一个javascript人,我会说,假正好等于0,真正好等于1。我认为这就是Oracle没有实现它的原因,因为隐式类型强制似乎不太可靠。我希望他们更喜欢显式的WHERE子句以更通用、定义更明确的方式做同样的事情。谢谢@jeffreykemp
我希望答案可以归结为Oracle在SQL中没有boolean数据类型(在pl/sql中有一个布尔值)。表达式a != b必须对布尔值进行计算,而SQL需要能够将其作为第一类数据类型进行处理,以便执行类似于ORDER BY的操作或将其返回到SELECT列表中。
你发表的case声明或同等的DECODE声明可能是你最好的选择。你可以通过创建一个用户定义的布尔类型来实现一些方法,比如对结果进行排序,并使用它来评估你的条件,从而在这里做一些毫无意义的过度杀戮(但可能不是你要解决的实际问题)。但这比你的case语句的代码还要多。
- 它可能不支持布尔值,因为它是可选的。唯一执行布尔值的ANSI平台是PostgreSQL。有趣的是,MySQL和MS Access都有布尔值,我们知道它们的SQL是什么样子的。
- 很好的回答-谢谢,同时也感谢@conradfrix,他解释了背后的原因。
- 20世纪80年代IBM PC的DBASE II也支持布尔数据类型!