﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Oracle / Базы данных  / Логика if-then-else в update,select-предложениях. Варианты решений. / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Wed, 03 Dec 2008 05:48:33 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Логика if-then-else в update,select-предложениях. Варианты решений.</title><link>http://www.relib.com/forums/Topic742515-21-1.aspx</link><description>decode подойдет только если необходимо сравнивать на равенство, т.е. в очень простых случаях.&lt;BR&gt;А если мне необходим такой эквивалент:&lt;BR&gt;update T1 set F1=(case when F1 Between 5 and 9 then 1 else 4 end;),&lt;BR&gt;              F2=(case when F2&amp;lt;3 then 5 else F2+F1 end;) &lt;BR&gt;Как мне быть в этом случае?</description><pubDate>Tue, 26 Feb 2002 12:16:00 GMT</pubDate><dc:creator>Снежок</dc:creator></item><item><title>RE: Логика if-then-else в update,select-предложениях. Варианты решений.</title><link>http://www.relib.com/forums/Topic742515-21-1.aspx</link><description>Да, еще одно. Конструкцию (CASE WHEN THEN ELSE END) можно использовать в DML операторах только при исполнении в SQL.&lt;BR&gt;А в SQL-екзекуторе PL/SQL-блоков вышеупомянутая конструкция не поддерживается!</description><pubDate>Fri, 22 Feb 2002 16:41:00 GMT</pubDate><dc:creator>VVP</dc:creator></item><item><title>RE: Логика if-then-else в update,select-предложениях. Варианты решений.</title><link>http://www.relib.com/forums/Topic742515-21-1.aspx</link><description>В Oracle8i есть конструкция (case when ... then ... else ... end).&lt;BR&gt;[code]&lt;BR&gt;-- вот как должен выглядеть твой код&lt;BR&gt;update Table1 set F1=(case when F2&amp;gt;2 then F3-F2 else F3+F2 end);&lt;BR&gt;[/code]&lt;BR&gt;decode делает тоже самое, только нельзя написать decode(a&amp;lt;b,...,...), а в конструкции case можно, что уже показано вверху. &lt;BR&gt;Допускается до 127 вложенных конструкций when ... then ... для одного case.&lt;BR&gt;Полный синтаксис:&lt;BR&gt;[code]&lt;BR&gt;case when CONDITION_001 then RESULT_001&lt;BR&gt;     when CONDITION_002 then RESULT_002&lt;BR&gt;     ...&lt;BR&gt;     when CONDITION_N then RESULT_N&lt;BR&gt;     else RESULT_ELSE end&lt;BR&gt;[/code]&lt;BR&gt;Не забывай выделять скобками всю конструкцию.&lt;BR&gt;CONDITION_XXX - это такое логическое условие, которое можно использовать в конструкции (if ... then ... end if).&lt;BR&gt;RESULT_XXX - это выражение, возвращающее некий результат.&lt;BR&gt;&lt;BR&gt;Успехов.</description><pubDate>Fri, 22 Feb 2002 14:44:00 GMT</pubDate><dc:creator>VVP</dc:creator></item><item><title>RE: Логика if-then-else в update,select-предложениях. Варианты решений.</title><link>http://www.relib.com/forums/Topic742515-21-1.aspx</link><description>DECODE&lt;BR&gt;Синтаксис&lt;BR&gt;DECODE(базовое_выражение, &lt;BR&gt;       выражение_сравнения1, значение1,&lt;BR&gt;       выражение_сравнения2, значение2,&lt;BR&gt;       ......................&lt;BR&gt;       значение_по_умолчанию)&lt;BR&gt;&lt;BR&gt;Назначение &lt;BR&gt;Ф-ция DECODE аналог. серии влож. операторов IF-THEN-ELSE. Базовое_выражение последовательно сравнивается с выражение_сравнения1, выражение_сравнения2 и т.д. Если Базовое_выражение соотв. i-му пункту сравнения, возвр. i-е значение.&lt;BR&gt;Если базовое_выражение  не соотв. ни одному пункту, возвр. значение_по_умолчанию.&lt;BR&gt;Выражения сравнения рассматриваются по очереди. Если найдено соответствие, оставшиеся пункты сравнения (если они есть) не рассматриваются. Если базовое_выражение явл. NULL-значением, оно счит. эквив. выражению сравнения типа NULL.&lt;BR&gt;&lt;BR&gt;Область применения.&lt;BR&gt;Только SQL-операторы.&lt;BR&gt;&lt;BR&gt;Пример.&lt;BR&gt;SELECT DECODE('abc', 'a',1,&lt;BR&gt;                     'b',2,&lt;BR&gt;                     'abc',3,&lt;BR&gt;                     'd',4,&lt;BR&gt;                      -1) &amp;quot;Decode 1&amp;quot;&lt;BR&gt;FROM dual;&lt;BR&gt;&lt;BR&gt;Decode 1&lt;BR&gt;--------&lt;BR&gt;       3&lt;BR&gt;&lt;BR&gt;SELECT DECODE(NULL, 'a',1,&lt;BR&gt;                    NULL,2) &amp;quot;Decode 2&amp;quot;&lt;BR&gt;FROM dual;&lt;BR&gt;&lt;BR&gt;Decode 2&lt;BR&gt;--------&lt;BR&gt;       2 &lt;BR&gt;Скотт Урман ©.</description><pubDate>Fri, 22 Feb 2002 12:51:00 GMT</pubDate><dc:creator>xGrey</dc:creator></item><item><title>Логика if-then-else в update,select-предложениях. Варианты решений.</title><link>http://www.relib.com/forums/Topic742515-21-1.aspx</link><description>Необходимо реализовать логику if-then-else в update,select-предложениях.&lt;BR&gt;В transact- и Ansi-sql можно было так:&lt;BR&gt;&lt;BR&gt;update Table1 set F1=case when F2&amp;gt;2 then F3-F2 else F3+F2;&lt;BR&gt;&lt;BR&gt;В pl/sql можно использовать для этих целей функцию decode.&lt;BR&gt;Объясните мне только поподробнее как она работает и приведите примеры.&lt;BR&gt;&lt;BR&gt;update Table1 set F1=case when F2&amp;gt;2 then F3-F2 else F3+F2;&lt;BR&gt;&lt;BR&gt;Можно использовать вторичные функции, но такой вариант мне не кажется удобным и разумным:&lt;BR&gt;&lt;BR&gt;update Table1 set F1=My_Func(параметры);&lt;BR&gt;&lt;BR&gt;Создание курсора,движение по нему и последовательное обновление каждой записи не рассматривается, потому как это заведомо медленный вариант.&lt;BR&gt;Может есть другие варианты решений.&lt;BR&gt;И пожалуйста по-больше примеров и разъяснений по использованию decode.</description><pubDate>Fri, 22 Feb 2002 11:36:00 GMT</pubDate><dc:creator>Снежок</dc:creator></item></channel></rss>