Oracle:如何比较查询中的两个NUMBERS值?'TRUE'或'FALSE'?

时间:2012-05-08 08:28:57

标签: sql oracle

我想比较两个数字。我们取1和2。

我尝试编写以下查询,但它根本无法正常工作(Toad说:ORA-00923:找不到FROM关键字):

SELECT 1 > 2 from dual

DECODE类似于Switch案例,那么如何才能获得表达式评估的结果(即数字比较),将其置于选择列表中?

我找到了一个使用函数而不是SELECT LIST中的表达式的解决方案:即

select DECODE(SIGN(actual - target)
           , -1, 'NO Bonus for you'
           , 0,'Just made it'
           , 1, 'Congrats, you are a winner')
from some_table

有更优雅的方式吗?

另外,如何比较两个日期?

4 个答案:

答案 0 :(得分:8)

sql中没有布尔类型(至少在oracle中) 你可以使用case

SELECT CASE when 1 > 2 THEN 1 ELSE 0 END FROM dual

但是您的解决方案(解码)也很好,请阅读here

答案 1 :(得分:5)

SIGN()函数确实可能是分​​类(in)等于你可能感兴趣的最佳方法,如果你想测试一个> b,a = b和a< b,它将接受date-date或numeric-numeric作为参数。

我按优先顺序使用Case语句,而不是解码。

Select
  case sign(actual-target)
    when -1 then ...
    when  0 then ...
    when  1 then ...
  end

答案 2 :(得分:1)

你可以用sql

比较两个日期

方法(1):

SELECT   TO_DATE('01/01/2012') - TO_DATE('01/01/2012')  
FROM DUAL--gives zero

方法(2):

SELECT CASE 

when MONTHS_BETWEEN('01/01/2012','01/01/2010') > 0 
THEN 'FIRST IS GREATER' 
ELSE 'SECOND IS GREATER OR EQUAL'  END

 FROM dual
抱歉,我无法格式化格式工具栏消失的代码! 有谁知道为什么?

答案 3 :(得分:1)

SELECT (CASE 
WHEN (SIGN(actual - target) > 0 ) THEN 
 'NO Bonus for you' 
ELSE 
 'Just made it'  END)
FROM dual