Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Оператор IF в стандарте SQL:2003

Заметил, что на моем сайте довольно часто ищут информацию по оператору IF в языке структурированных запросов SQL. Чтобы эти поиски приводили к успеху, решил подробно осветить этот вопрос. Оператор IF был введен в стандарт SQL в 2003 году и описан в спецификации "(ISO-ANSI Working Draft) Persistent Stored Modules (SQL/PSM)" (Август, 2003), которая и является основным источником этой статьи.

Согласно стандарту SQL/PSM условный оператор IF имеет следующий синтаксис:

IF <логическое выражение 1>
    THEN <последовательность запросов SQL 1>
    [ ELSEIF <логическое выражение 2> THEN <последовательность запросов SQL 2>... ]
    [ ELSE <последовательность запросов SQL 3> ]
END IF

Квадратные скобки в этом определении означают, что их содержимое может быть опущено. Конструкция "ELSEIF" может повторяться многократно. Она позволяет указывать альтернативные логические выражения.

Условный оператор IF работает следующим образом:

  1. Если логическое выражение, указанное непосредственно после ключевого слова IF принимает значение TRUE (ИСТИНА), то выполняется последовательность запросов SQL, находящаяся непосредственно после ключевого слова THEN.
  2. Если логическое выражение после ключевого слова IF не принимает значение TRUE (то есть принимает значение FALSE либо UNKNOWN), то выполняются следующие действия:

    1. Если в запросе имеется одна или несколько конструкций ELSEIF, то в порядке их очередности проверяется логическое выражение, следующее за ключевым словом ELSEIF. В случае, если это выражение принимают значение TRUE, то выполняется последовательность запросов SQL, следующих за ключевым словом THEN соответствующей конструкции ELSEIF. В противном случае, рассматривается следующая конструкция ELSEIF (если она есть).
    2. Если в запросе имеется конструкция ELSE и ни одно из логических выражений IF и ELSEIF не оказалось верным (TRUE), то выполняется последовательность запросов SQL, следующих непосредственно за ключевым словом ELSE.

Следует заметить, что если в запросе есть конструкция ELSEIF, то от нее можно отказаться с помощью следующей рекурсивной трансформации запроса:

IF <логическое выражение 1>
    THEN <последовательность запросов SQL 1>
    ELSEIF <логическое выражение 2>
        THEN <последовательность запросов SQL 2>
    [ ELSEIF <логическое выражение 3> THEN <последовательность запросов SQL 3>... ]
    [ ELSE <последовательность запросов SQL 4> ]
END IF

Полностью эквивалентно следующему:

IF <логическое выражение 1>
    THEN <последовательность запросов SQL 1>
    ELSE
        IF <логическое выражение 2>
            THEN <последовательность запросов SQL 2>
            [ ELSEIF <логическое выражение 3> THEN <последовательность запросов SQL 3>... ]
            [ ELSE <последовательность запросов SQL 4> ]
        END IF
END IF

Последовательно используя эту трансформацию можно избавиться от всех конструкций вида "ELSEIF". Хотя вряд ли это может быть целесообразно в реальных приложениях.

В заключение приведем тривиальный, но полностью рабочий пример из PL/pgSQL, демонстрирующий работу оператора IF. Создаем функцию:

CREATE OR REPLACE FUNCTION my_function(my_var integer) RETURNS varchar AS $$
BEGIN
    IF my_var > 200 THEN
        RETURN 'Больше 200';
    ELSEIF my_var > 100 THEN
        RETURN 'Больше 100, меньше или равно 200';
    ELSE
        RETURN 'Меньше или равно 100';
    END IF;
END
$$ LANGUAGE plpgsql;

Проверяем ее работу:

SELECT my_function(50);
SELECT my_function(150);
SELECT my_function (250);

Впрочем, необходимо оговориться, что PostgreSQL не поддерживает стандарт SQL/PSM и хотя PL/pgSQL очень похож на SQL/PSM, но не полностью ему соответствует.

Автор: Дмитрий Скоробогатов, 11.11.2010


Предыдущие публикации:

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2011-01-19 08:54:45

Метки материала: if, sql, оператор if, sql:2003, программирование, база данных, язык программирования, db

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.