-
CASEvalueWHEN [compare-value] THENresult[WHEN [compare-value] THENresult...] [ELSEresult] END,CASE WHEN [condition] THENresult[WHEN [condition] THENresult...] [ELSEresult] ENDLa primera versión retorna
resultdondevalue=compare-value. La segunda versión retorna el resultado para la primera condición que es cierta. Si no hay ningún resultado coincidente, el resultado trasELSEse retorna, oNULLsi no hay parteELSE.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; -> NULLEl tipo de retorno por defecto de una expresión
CASEes el tipo agregado compatible de todos los valores de retorno, pero también depende del contexto en el que se usa. Si se usa en un entorno de cadenas de carácteres, el resultado se retorna como cadena de carácteres. Si se usa en un contexto numérico, el resultado se retorna como valor decimal, real o entero. -
IF(expr1,expr2,expr3)Si
expr1es TRUE (expr1<> 0 andexpr1<> NULL) entoncesIF()retornaexpr2; de otro modo retornaexpr3.IF()retorna un valor numérico o cadena de carácteres, en función del contexto en que se usa.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'Si sólo una de
expr2oexpr3es explícitamenteNULL, el tipo del resultado de la funciónIF()es el mismo tipo que la expresión noNULL.expr1se evalúa como un valor entero, que significa que si esta testeando valores de punto flotante o cadenas de carácteres, debe hacerlo mediante operaciones de comparación.mysql> SELECT IF(0.1,1,0); -> 0 mysql> SELECT IF(0.1<>0,1,0); -> 1En el primer caso mostrado,
IF(0.1)retorna 0 ya que 0.1 se convierte a un valor entero, resultando en un test deIF(0). Puede que esto no ea lo que espera. En el segundo caso, la comparación testea el valor de coma flotante para comprobar que no es cero. El resultado de la comparación se usa como entero.El tipo de retorno de
IF()(que puede ocurrir cuando se almacena en una tabla temporal) se calcula como sigue:Expresión Valor Retornado expr2oexpr3retorna una cadenacadena de carácteres expr2oexpr3retorna un valor de coma flotantecoma flotante expr2oexpr3retorna un enteroentero Si
expr2yexpr3son cadenas de carácteres, el resultado es sensible a mayúsculas si alguna de las cadenas lo es. -
IFNULL(expr1,expr2)Si
expr1no esNULL,IFNULL()retornaexpr1, de otro modo retornaexpr2.IFNULL()retorna un valor numérico o de cadena de carácteres, en función del contexto en que se usa.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'El valor por defecto de retorno de
IFNULL(expr1,expr2) es el más “general” de las dos expresiones, en el ordenSTRING,REAL, oINTEGER. Considere el caso de una tabla basada en expresiones o donde MySQL debe almacenar internamente un valor retornado porIFNULL()en una tabla temporal:CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
En este ejemplo, el tipo de la columna
testesCHAR(4). -
NULLIF(expr1,expr2)Retorna
NULLsiexpr1=expr2es cierto, de otro modo retornaexpr1. Es lo mismo queCASE WHENexpr1=expr2THEN NULL ELSEexpr1END.mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1Tenga en cuenta que MySQL evalúa
expr1dos veces si los argumentos no son iguales.