Spec-Zone.ru › MySQL 8.4

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-8.4-en/flow-control-functions.html

Spec-Zone.ru

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