Reputation: 23
I am trying to do an IF/ELSE statement for PLSQL but I am not sure if I am doing it the right way as it is always having an error: Missing right parenthesis on IF (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)) != TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2))) THEN but the parenthesis seems balance to me.
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
Please kindly assist me on this issue.
Upvotes: 1
Views: 1614
Reputation: 1990
You can modify your query to something on the lines as shown below,
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
Upvotes: 0
Reputation: 247710
You should be able to use a CASE
statement to get the result:
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
Upvotes: 5