У меня есть простая функция, написанная на Oracle 9i (версия 9.2.0.4.0) для имитации встроенного IF. Для тех, кто заинтересован, вот код:
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 из окна. Оракул кажется распространенным с такими видами безумия.
РЕДАКТИРОВАТЬ: есть ли какой-то магический синтаксис, который я должен использовать, чтобы использовать оператор равенства в операторе выбора?