2009-01-15 89 views
0

我有一個寫在Oracle 9i(版本9.2.0.4.0)中的簡單函數來模擬一個內聯IF。對於那些感興趣的,這裏是代碼:Oracle 9i:假設缺少右括號

create or replace 
FUNCTION IIF 
    (testExpression NUMBER, 
    trueResult NUMBER, 
    falseResult NUMBER) 
RETURN NUMBER 
AS 
BEGIN 
    /* 
     A simple in-line IF function for use with SQL queries. If the test 
     expression evaluates to any non-zero value, it is considered to be 
     true, and the trueResult is returned. Otherwise, falseResult is 
     returned. 
    */ 
    IF (testExpression is null) or (testExpression = 0) THEN 
     return falseResult; 
    ELSE 
     return trueResult; 
    END IF; 
END IIF; 

這不是火箭科學。現在,這裏的大謎:如果我執行下面的SQL語句,一切都蠻好的,正是工程,我想到:

SELECT IIF(1, 'true', 'false') FROM DUAL; 
SELECT IIF(0, 'false', 'true') FROM DUAL; 

但是,下面生成一個從Oracle真正古怪的錯誤:

SELECT IIF((0 = 1), 'false', 'true') FROM DUAL; 

該錯誤如下:

ORA-00907: missing right parenthesis. 

顯然,事實並非如此。有人會碰巧解釋這種奇怪的一點嗎?

現在需要大量的自我控制來限制自己將Oracle服務器拋出窗外。甲骨文似乎riff與這些類型的情緒。

編輯:有一種神奇的語法,我必須使用在select語句中使用相等運算符?

+0

您不能在選擇語句的選擇列表中使用關係運算符。 – DCookie 2009-01-16 00:19:16

回答

5

也許你可以解釋你正在嘗試做什麼。我認爲您正在尋找CASEDECODE的功能,但我無法確定。由於某種原因,您似乎在處理SQL語言的問題。

SQL> SELECT IIF(1>7, 0, 1) FROM DUAL; 
SELECT IIF(1>7, 0, 1) FROM DUAL 
      * 
ERROR at line 1: 
ORA-00907: missing right parenthesis 

SQL> SELECT 1=0 FROM DUAL; 
SELECT 1=0 FROM DUAL 
     * 
ERROR at line 1: 
ORA-00923: FROM keyword not found where expected 

this Ask Tom article:由於Oracle不指望一個關係運算符查詢的select子句中出現

錯誤。

+0

首先,感謝這篇文章的指針(儘管我認爲湯姆爭吵是爲了爭論,並且顯示出一種非常*固執的連續性)。我現在明白爲什麼它不起作用。 (續) – 2009-01-16 00:48:06

0

從未接觸過與Oracle工作,我不能直接提供任何合理的建議,但看着聲明它也可以是具有從布爾推斷號碼有問題的Oracle?..

的IIF簽名期待一個號碼作爲第一個參數並在調用中傳遞BOOL評估。

這只是一個想法。

1
  1. Oracle數據庫中沒有BOOLEAN類型,所以不能使用像「(1 = 0)」這樣的表達式。
  2. 即使有BOOLEAN類型,您已聲明第一個參數爲NUMBER類型。您必須將其傳遞給一個數字,或者可以隱式轉換爲一個數字。
  3. 最後,我不明白你的任何例子實際上是如何產生除「無效數字」之外的任何東西的,因爲你的第二個和第三個參數也不能轉換爲數字。
3

你想

SELECT CASE WHEN EXPR然後 '真正的' 其他 '假' 端col_alias FROM DUAL;

或簡單的相等測試

SELECT DECODE(VAL1val2的, '真', '假')col_alias FROM雙重;

這比執行PL/SQL函數要好得多。 您的方法無法正常工作的原因有很多。

  1. 布爾值不是Oracle數據類型。

  2. 他們是一個PL/SQL數據類型,但即使如此,沒有隱式轉換爲數字(零假,非零真)

  3. 有沒有「表達」的數據類型,所以SQL引擎無法將表達式傳遞給PL/SQL。

  4. 即使您將表達式作爲字符串傳遞給PL/SQL,PL/SQL引擎也無法動態地評估字符串中的表達式。它必須將該字符串構建爲動態SQL語句並動態執行,返回結果(使用有效的SQL數據類型,如字符串或數字)。

0

除了解碼和情況,還有nvl。