-
CASE
value
WHEN [compare-value
] THENresult
[WHEN [compare-value
] THENresult
...] [ELSEresult
] END,CASE WHEN [
condition
] THENresult
[WHEN [condition
] THENresult
...] [ELSEresult
] ENDLa primera versión retorna
result
dondevalue
=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 trasELSE
se retorna, oNULL
si 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; -> NULL
El tipo de retorno por defecto de una expresión
CASE
es 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
expr1
es 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
expr2
oexpr3
es explícitamenteNULL
, el tipo del resultado de la funciónIF()
es el mismo tipo que la expresión noNULL
.expr1
se 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); -> 1
En 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 expr2
oexpr3
retorna una cadenacadena de carácteres expr2
oexpr3
retorna un valor de coma flotantecoma flotante expr2
oexpr3
retorna un enteroentero Si
expr2
yexpr3
son cadenas de carácteres, el resultado es sensible a mayúsculas si alguna de las cadenas lo es. -
IFNULL(
expr1
,expr2
)Si
expr1
no 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
test
esCHAR(4)
. -
NULLIF(
expr1
,expr2
)Retorna
NULL
siexpr1
=expr2
es cierto, de otro modo retornaexpr1
. Es lo mismo queCASE WHEN
expr1
=expr2
THEN NULL ELSEexpr1
END.mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
Tenga en cuenta que MySQL evalúa
expr1
dos veces si los argumentos no son iguales.