2013-01-11 130 views
1

我正在嘗試爲PLSQL執行IF/ELSE語句,但我不確定是否以正確的方式執行,因爲它總是有錯誤:缺少右括號如果(TO_NUMBER (SUBSTR(ATTR_VALUE,6,2))!= TO_NUMBER(SUBSTR(ATTR_VALUE,1,2)))那麼 但括號對我來說似乎是平衡的。SQL中的IF/ELSE條件

SELECT * 
FROM 
(
IF (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)) != TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2))) THEN 
    SELECT ID, DATE, ATTR_VALUE, (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))-48) DIFF 
ELSE 
    SELECT ID, DATE, ATTR_VALUE, (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))) DIFF 
END IF 
FROM Table A 
ORDER BY TIME 
) 
WHERE DIFF>26 

請在這個問題上協助我。

+0

你舉的例子是普通的SQL ,沒有涉及PL/SQL(存儲過程) –

+0

if語句僅在pl/sql中需要使用case或decode語句,正如其他人所建議的那樣。 – glh

回答

5

您應該能夠使用CASE語句來得到結果:

SELECT * 
FROM 
(
    SELECT ID, 
    DATE, 
    ATTR_VALUE, 
    CASE 
     WHEN TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)) != TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2)) 
     THEN (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))-48) 
     ELSE (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))) 
    END DIFF 
    FROM Table A 
    ORDER BY TIME 
) 
WHERE DIFF>26 
+0

非常感謝您的幫助! – Wil50n

0

,如下圖所示,您可以修改您的查詢上線的東西,

SELECT * 
    FROM (SELECT ID, 
       DATE, 
       ATTR_VALUE, 
       decode(TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)), 
         TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2)), 
         TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4)) - 
         TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4)), 
         TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4)) - 
         TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))) DIFF 
      FROM A) 
WHERE diff > 26 
+0

非常感謝您的幫助! – Wil50n

+0

歡迎您! – Orangecrush