2012-05-08 57 views
7

我想比較兩個數字。讓我們即1和2Oracle:如何在查詢中比較兩個NUMBERS值「TRUE」或「FALSE」?

我試着寫下面的查詢,但它只是沒有按預期工作(蟾蜍說:ORA-00923:FROM關鍵字未找到預期):

SELECT 1 > 2 from dual 

DECODE就像一個Switch案例,所以我怎樣才能得到表達評估(即數字比較)的結果放在選擇列表中?

我已經發現在選擇列表中使用的功能的溶液代替的表達式:即

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

是否有一個更優雅的方式?

另外我該如何比較兩個日期?

+1

我發現使用功能的表達,而不是在選擇列表中的解決方案:即DECODE(SIGN(實際目標),-1,「不發獎金給你」,0,「只是做它',1,'恭喜你,你是一個贏家')。 有沒有更優雅的方式? 以及如何比較兩個日期 – Revious

+1

請修改您的問題以包含相關信息,而不是留言。 – APC

+0

[Oracle:選擇列表中的整數之間的比較]可能的重複(http://stackoverflow.com/questions/10494955/oracle-comparison-between-integer-in-select-list) – 2012-05-17 19:32:18

回答

5

SIGN()函數確實可能是分​​類(在)平等的最好方法,如果您想測試a> b,a = b和< b,並且它會接受日期日期或數字 - 數字作爲參數。

我會優先使用Case語句,而不是解碼。

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

當我們所有的東西都是'DECODE'時,使用'SIGN'是必要的,但是對於'CASE',我認爲它只是使代碼不太清晰。您可以簡單地寫出比較結果:'當a> b時...當a = b時...當a

+1

可能如此,特別是如果比較非常簡短(a> b)......如果你有一些可怕的長時間表達來處理你不想重複的事情(例如,確定是否是之前,之後或之後的某些事情,那麼SIGN()應該會更有用。財政年度,可能有點困難)或一些昂貴的函數來調用來評估表達式。 –

7

sql中沒有布爾類型(至少在oracle中)。
您可以使用case

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

但你的解決方案(解碼)也不錯,閱讀here

+0

SQL標準*確定了*布爾數據類型,但是 - 正如您正確提到的那樣 - Oracle SQL不支持它(與其他DBMS不同)。在PL/SQL過程中,您可以定義布爾變量。 –

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 

對不起,我不能格式化格式化工具欄消失的代碼! 做任何人知道爲什麼?

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