Spec-Zone.ru › MySQL 9.2

14.5 Функции управления потоком

Таблица 14.7 Операторы управления потоком

Таблица 14.7 Операторы управления потоком
Имя Описание
CASE Оператор выбора
IF() Конструкции if/else
IFNULL() Конструкция null if/else
NULLIF() Возвращает NULL, если expr1 = expr2

  • CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END

    CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END

    Первый CASE синтаксис возвращает result для первого value=compare_value сравнения, которое истинно. Второй синтаксис возвращает результат для первого истинного условия. Если ни одно сравнение или условие не истинно, возвращается результат после ELSE, или NULL, если нет части ELSE.

    Примечание

    Синтаксис оператора CASE оператор, описанный здесь, немного отличается от синтаксиса SQL-выражения CASE выражения, описанного в разделе 15.6.5.1 «Выражение CASE», для использования внутри хранимых программ. Выражение CASE не может иметь ELSE NULL-оператор, и оно завершается с помощью END CASE вместо END.

    Тип возвращаемого значения выражения CASE — это агрегированный тип всех значений результата:

    • Если все типы являются числовыми, агрегированный тип также является числовым:

      • Если хотя бы один аргумент имеет двойную точность, результат также имеет двойную точность.

      • В противном случае, если хотя бы один аргумент является DECIMAL, результат является DECIMAL.

      • В противном случае, результат — целочисленный тип (за исключением одного случая):

        • Если все целочисленные типы имеют одинаковый знак (все со знаком или все без знака), результат имеет тот же знак и точность — максимальная из всех указанных целочисленных типов (то есть, TINYINT, SMALLINT, MEDIUMINT, INT или BIGINT).

        • Если есть сочетание со знаком и без знака, результат будет со знаком, а точность может быть выше. Например, если типы — целые со знаком INT и целые без знака INT, результатом будет целое со знаком BIGINT.

        • Исключением является сочетание беззнаковых BIGINT с любым типом целых со знаком. Результат будет DECIMAL с достаточной точностью и масштабом 0.

    • Если все типы являются BIT, результат — BIT. В противном случае, аргументы BIT обрабатываются аналогично BIGINT.

    • Если все типы — YEAR, результат — YEAR. В противном случае, аргументы YEAR обрабатываются аналогично INT.

    • Если все типы — строковые ( CHAR или VARCHAR), результат — VARCHAR с максимальной длиной, определяемой самой длинной строкой операндов.

    • Если все типы — строковые или двоичные строки, результатом будет VARBINARY.

    • SET и ENUM обрабатываются аналогично VARCHAR; результатом будет VARCHAR.

    • Если все типы — JSON, результатом будет JSON.

    • Если все типы — временные, результатом будет временной тип:

      • Если все временные типы — DATE, TIME или TIMESTAMP, результатом будет DATE, TIME или TIMESTAMP соответственно.

      • В противном случае, при смешанных временных типах, результатом будет DATETIME.

    • Если все типы — GEOMETRY, результатом будет GEOMETRY.

    • Если какой-либо тип — BLOB, результатом будет BLOB.

    • Во всех других комбинациях типов, результатом будет VARCHAR.

    • Литеральные NULL операнды игнорируются при агрегировании типов.

    mysql> SELECT CASE 1 WHEN 1 THEN 'one'
        ->     WHEN 2 THEN 'two' ELSE 'more' END;
            -> 'one'
    mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
            -> 'true'
    mysql> SELECT CASE BINARY 'B'
        ->     WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
            -> NULL
    
  • IF(expr1,expr2,expr3)

    Если expr1 — TRUE (expr1 <> 0 и expr1 IS NOT NULL), IF() возвращает expr2. В противном случае возвращает expr3.

    Примечание

    Также существует IF выражение, которое отличается от IF() функции, описанной здесь. Смотрите раздел 15.6.5.2 «Выражение IF».

    Если только один из expr2 или expr3 явно NULL, тип результата функции IF() — тип не-NULL выражения.

    Тип результата по умолчанию для IF() (что может иметь значение при сохранении в временную таблицу) рассчитывается следующим образом:

    • Если expr2 или expr3 производят строку, результатом будет строка.

      Если expr2 и expr3 — обе строки, результатом будет регистрозависимый тип, если хотя бы одна из строк регистрозависимая.

    • Если expr2 или expr3 производят значение с плавающей точкой, результатом будет значение с плавающей точкой.

    • Если expr2 или expr3 производят целое число, результатом будет целое число.

    mysql> SELECT IF(1>2,2,3);
            -> 3
    mysql> SELECT IF(1<2,'yes','no');
            -> 'yes'
    mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
            -> 'no'
    
  • IFNULL(expr1,expr2)

    Если expr1 не NULL, IFNULL() возвращает expr1; в противном случае возвращает expr2.

    mysql> SELECT IFNULL(1,0);
            -> 1
    mysql> SELECT IFNULL(NULL,10);
            -> 10
    mysql> SELECT IFNULL(1/0,10);
            -> 10
    mysql> SELECT IFNULL(1/0,'yes');
            -> 'yes'
    

    По умолчанию тип возвращаемого значения IFNULL(expr1,expr2) — более “общий” из двух выражений в порядке STRING, REAL или INTEGER. Рассмотрим случай таблицы, основанной на выражениях, или когда MySQL должен вставить значение, возвращаемое IFNULL(), во временную таблицу:

    mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
    mysql> DESCRIBE tmp;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | test  | varbinary(4) | NO   |     |         |       |
    +-------+--------------+------+-----+---------+-------+
    

    В этом примере тип столбца test — VARBINARY(4) (строковый тип).

  • NULLIF(expr1,expr2)

    Возвращает NULL, если expr1 = expr2 истинно, в противном случае возвращает expr1. Это то же, что и CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.

    Возвращаемое значение имеет тот же тип, что и первый аргумент.

    mysql> SELECT NULLIF(1,1);
            -> NULL
    mysql> SELECT NULLIF(1,2);
            -> 1
    
    Примечание

    MySQL оценивает expr1 дважды, если аргументы не равны.

Для каждой из этих функций, если первый аргумент содержит только символы, присутствующие в наборе символов и сортировке, используемых вторым аргументом (и он является константой), используется набор символов и сортировка последнего. Значения системных переменных обрабатываются как значения столбцов с тем же набором символов и сортировкой. Некоторые запросы, использующие эти функции с системными переменными, могут быть отклонены с ошибкой Незаконная комбинация сортировок в результате. В таких случаях следует привести системную переменную к правильному набору символов и сортировке.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/flow-control-functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API