8

我想比较两个数字。让我们以 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

4 回答 4

8

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

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

但是您的解决方案(解码)也不错,请阅读此处

于 2012-05-08T08:37:57.550 回答
6

如果您想测试 a > b、a = b 和 a < b ,SIGN()函数确实可能是您可能感兴趣的分类(不)等式的最佳方法,并且它将接受日期-日期或数字-numeric 作为参数。

我会优先使用 Case 语句,而不是解码。

Select
  case sign(actual-target)
    when -1 then ...
    when  0 then ...
    when  1 then ...
  end
于 2012-05-08T11:01:04.243 回答
1

你可以用sql比较两个日期

方法(一):

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

抱歉,我无法格式化代码格式化工具栏消失了!有人知道为什么吗?

于 2012-05-08T08:43:44.657 回答
1
SELECT (CASE 
WHEN (SIGN(actual - target) > 0 ) THEN 
 'NO Bonus for you' 
ELSE 
 'Just made it'  END)
FROM dual
于 2012-05-08T16:53:39.757 回答