Логика if-then-else в update,select-предложениях. Варианты решений.
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Логика if-then-else в... Expand / Collapse
Автор
Сообщение
22.02.2002 11:36
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum 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.
Сообщ. #742515
22.02.2002 12:51
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum 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
Скотт Урман ©.
Сообщ. #742525
22.02.2002 14:44
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum 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 - это выражение, возвращающее некий результат.

Успехов.
Сообщ. #742536
22.02.2002 16:41
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 17.04.2003 15:55
Сообщ.: 69, Visits: 760
Да, еще одно. Конструкцию (CASE WHEN THEN ELSE END) можно использовать в DML операторах только при исполнении в SQL.
А в SQL-екзекуторе PL/SQL-блоков вышеупомянутая конструкция не поддерживается!
Сообщ. #742547
26.02.2002 12:16
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum 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;)
Как мне быть в этом случае?
Сообщ. #742741
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 8:26