|
|
|
Forum Member
      
участник
Last Login: 13.03.2002 15:37
Сообщ.: 34,
Visits: 375
|
|
Необходимо реализовать логику if-then-else в update,select-предложениях. В transact- и Ansi-sql можно было так:
update Table1 set F1=case when F2>2 then F3-F2 else F3+F2;
В pl/sql можно использовать для этих целей функцию decode. Объясните мне только поподробнее как она работает и приведите примеры.
update Table1 set F1=case when F2>2 then F3-F2 else F3+F2;
Можно использовать вторичные функции, но такой вариант мне не кажется удобным и разумным:
update Table1 set F1=My_Func(параметры);
Создание курсора,движение по нему и последовательное обновление каждой записи не рассматривается, потому как это заведомо медленный вариант. Может есть другие варианты решений. И пожалуйста по-больше примеров и разъяснений по использованию decode.
|
|
|
|
|
Forum Guru
      
участник
Last Login: 28.12.2002 11:35
Сообщ.: 69,
Visits: 760
|
|
DECODE Синтаксис DECODE(базовое_выражение, выражение_сравнения1, значение1, выражение_сравнения2, значение2, ...................... значение_по_умолчанию)
Назначение Ф-ция DECODE аналог. серии влож. операторов IF-THEN-ELSE. Базовое_выражение последовательно сравнивается с выражение_сравнения1, выражение_сравнения2 и т.д. Если Базовое_выражение соотв. i-му пункту сравнения, возвр. i-е значение. Если базовое_выражение не соотв. ни одному пункту, возвр. значение_по_умолчанию. Выражения сравнения рассматриваются по очереди. Если найдено соответствие, оставшиеся пункты сравнения (если они есть) не рассматриваются. Если базовое_выражение явл. NULL-значением, оно счит. эквив. выражению сравнения типа NULL.
Область применения. Только SQL-операторы.
Пример. SELECT DECODE('abc', 'a',1, 'b',2, 'abc',3, 'd',4, -1) "Decode 1" FROM dual;
Decode 1 -------- 3
SELECT DECODE(NULL, 'a',1, NULL,2) "Decode 2" FROM dual;
Decode 2 -------- 2 Скотт Урман ©.
|
|
|
|
|
Forum Guru
      
участник
Last Login: 17.04.2003 15:55
Сообщ.: 69,
Visits: 760
|
|
В Oracle8i есть конструкция (case when ... then ... else ... end).
-- вот как должен выглядеть твой код update Table1 set F1=(case when F2>2 then F3-F2 else F3+F2 end);
decode делает тоже самое, только нельзя написать decode(a<b,...,...), а в конструкции case можно, что уже показано вверху. Допускается до 127 вложенных конструкций when ... then ... для одного case. Полный синтаксис:
case when CONDITION_001 then RESULT_001 when CONDITION_002 then RESULT_002 ... when CONDITION_N then RESULT_N else RESULT_ELSE end
Не забывай выделять скобками всю конструкцию. CONDITION_XXX - это такое логическое условие, которое можно использовать в конструкции (if ... then ... end if). RESULT_XXX - это выражение, возвращающее некий результат.
Успехов.
|
|
|
|
|
Forum Guru
      
участник
Last Login: 17.04.2003 15:55
Сообщ.: 69,
Visits: 760
|
|
Да, еще одно. Конструкцию (CASE WHEN THEN ELSE END) можно использовать в DML операторах только при исполнении в SQL. А в SQL-екзекуторе PL/SQL-блоков вышеупомянутая конструкция не поддерживается!
|
|
|
|
|
Forum Member
      
участник
Last Login: 13.03.2002 15:37
Сообщ.: 34,
Visits: 375
|
|
decode подойдет только если необходимо сравнивать на равенство, т.е. в очень простых случаях. А если мне необходим такой эквивалент: update T1 set F1=(case when F1 Between 5 and 9 then 1 else 4 end;), F2=(case when F2<3 then 5 else F2+F1 end;) Как мне быть в этом случае?
|
|
|
|