14.5 Функции управления потоком
Таблица 14.7 Операторы управления потоком
-
CASEvalueWHENcompare_valueTHENresult[WHENcompare_valueTHENresult...] [ELSEresult] ENDCASE WHENconditionTHENresult[WHENconditionTHENresult...] [ELSEresult] ENDПервый
CASEсинтаксис возвращаетresultдля первогосравнения, которое истинно. Второй синтаксис возвращает результат для первого истинного условия. Если ни одно сравнение или условие не истинно, возвращается результат послеvalue=compare_valueELSE, илиNULL, если нет частиELSE.ПримечаниеСинтаксис
CASEоператора, описанный здесь, немного отличается от синтаксиса SQLCASEоператора, описанного в Разделе 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.