14.5 Функции управления потоком
Таблица 14.7 Операторы управления потоком
-
CASEvalueWHENcompare_valueTHENresult[WHENcompare_valueTHENresult...] [ELSEresult] ENDCASE WHENconditionTHENresult[WHENconditionTHENresult...] [ELSEresult] ENDПервый
CASEсинтаксис возвращаетresultдля первогосравнения, которое истинно. Второй синтаксис возвращает результат для первого истинного условия. Если ни одно сравнение или условие не истинно, возвращается результат послеvalue=compare_valueELSE, или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.-
Если все типы — временные, результатом будет временной тип:
Если все типы —
GEOMETRY, результатом будетGEOMETRY.Во всех других комбинациях типов, результатом будет
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 -
-
Если
expr1—TRUE(иexpr1<> 0),expr1IS NOT NULLIF()возвращает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' -
-
Если
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)(строковый тип). -
Возвращает
NULL, еслиистинно, в противном случае возвращаетexpr1=expr2expr1. Это то же, что иCASE WHEN.expr1=expr2THEN NULL ELSEexpr1ENDВозвращаемое значение имеет тот же тип, что и первый аргумент.
mysql>
SELECT NULLIF(1,1);-> NULL mysql>SELECT NULLIF(1,2);-> 1ПримечаниеMySQL оценивает
expr1дважды, если аргументы не равны.
Для каждой из этих функций, если первый аргумент содержит только символы, присутствующие в наборе символов и сортировке, используемых вторым аргументом (и он является константой), используется набор символов и сортировка последнего. Значения системных переменных обрабатываются как значения столбцов с тем же набором символов и сортировкой. Некоторые запросы, использующие эти функции с системными переменными, могут быть отклонены с ошибкой Незаконная комбинация сортировок в результате. В таких случаях следует привести системную переменную к правильному набору символов и сортировке.
© 2025 Oracle
Licensed under the GPLv2 License.