如果我想按一个列排序一个表,但在MySQL中将一个指定的行提取到顶部,我可以这样做.(小提琴)
select * from name
order by surname != 'moon', surname
然而,当我想在甲骨文中这样做时,order子句中的真实测试不起作用,最后我不得不这样做.(小提琴)
select surname from name
order by case when surname = 'moon' then 0 else 1 end, surname
Oracle不支持order子句中的真实测试的原因是什么?
(甚至是select语句)
结果
(所有这些都是按字母顺序排列的,但moon
除外,它已浮动到顶部)
SURNAME
moon
adane
bell
day
larkin
williams
发布于 2013-08-20 19:54:49
我希望答案可以归结为这样一个事实,即Oracle中没有boolean
数据类型(PL/ SQL中有一个布尔值)。表达式a != b
必须计算为布尔值,而SQL需要能够将其作为一流的数据类型来处理,这样才能执行类似于ORDER BY
的操作或在SELECT
列表中返回它。
您发布的case
声明或相应的DECODE
很可能是您的最佳选择。您可以通过创建一个用户定义的布尔类型来实现一些不必要的过度杀戮(但可能不是在您试图解决的实际问题中),该类型实现了一些方法,例如对结果进行排序,并使用这些方法来评估您的条件。但这比您的CASE
语句更多代码。
https://stackoverflow.com/questions/18343688
复制相似问题