-
IFNULL(expr1,expr2)Если
expr1не равноNULL, то функцияIFNULL()возвращает значениеexpr1, в противном случае -expr2. В зависимости от контекста функцияIFNULL()может возвращать либо числовое, либо строковое значение: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'В 4.0.6 и раньше по умолчанию возвращал для
IFNULL(expr1,expr2)более "общее" из двух выражений в порядкеSTRING,REALилиINTEGER. Разница с более ранними версиями MySQL больше всего заметна тогда, когда вы создаете таблицу, основанную на выражении или MySQL внутренне сохраняет величину, основанную на выраженииIFNULL()во временной таблице.CREATE TABLE foo SELECT IFNULL(1,"test") as test;
В 4.0.6 тип для столбца "test" -
CHAR(4)в то время как на более ранних типом был быBIGINT. -
NULLIF(expr1,expr2)Если выражение
expr1 = expr2истинно, то возвращаетNULL, в противном случае -expr1. Эквивалентна операторуCASE WHEN x = y THEN NULL ELSE x END:mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1Отметим, что если аргументы не равны, то величина
expr1вычисляется в MySQL дважды. -
IF(expr1,expr2,expr3)Если
expr1равно значению ИСТИНА (expr1 <> 0иexpr1 <> NULL), то функцияIF()возвращаетexpr2, в противном случае -expr3. В зависимости от контекста функцияIF()может возвращать либо числовое, либо строковое значение: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'Если
expr2илиexpr3являютсяNULLтогда результирующим типомIF()будет тип, который не естьNULL. Это нововведение в MySQL 4.0.3.expr1вычисляется как целое число; это означает, что при исследовании чисел с плавающей точкой или строковых величин в этой функции необходимо использовать операцию сравнения:mysql> SELECT IF(0.1,1,0); -> 0 mysql> SELECT IF(0.1<>0,1,0); -> 1В первом случае из приведенных выше функция
IF(0.1)возвращает0, так как0.1преобразуется в целое число и в результате выполняется функцияIF(0). Но это вовсе не то, что должно было бы получиться. Во втором случае исходная величина с плавающей точкой исследуется при помощи оператора сравнения, чтобы определить, является ли она ненулевой, и в качестве аргумента функции используется результат сравнения - целое число. В версии MySQL 3.23 возвращаемый по умолчанию тип функцииIF()(это может иметь значение при сохранении его во временной таблице) вычисляется, как показано ниже:Выражение Возвращаемая величина expr2 или expr3 возвращает строку строка expr2 or expr3 возвращает величину с плавающей точкой с плавающей точкой expr2 or expr3 возвращает целое число целое число Если
expr2иexpr3являются строками, и обе регистро-независимы, то и результат является регистро-независимым (начиная с 3.23.51). -
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В первом варианте возвращается значение
result, еслиvalue=compare-value. Во втором - результат для первого указанного условияcondition, если оно истинно. Если соответствующая величина результата не определена, то возвращается значениеresult, указанное после оператораELSE. Если частьELSEв выражении отсутствует, возвращается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
Тип возвращаемой величины будет такой же (INTEGER, DOUBLE или STRING),
как и у первой возвращаемой величины (выражение после первого оператора
THEN).