CASE
,
value
WHEN
[compare-value
] THEN
result
[WHEN
[compare-value
] THEN
result
...] [ELSE
result
] ENDCASE WHEN [
condition
] THEN
result
[WHEN
[condition
] THEN
result
...] [ELSE
result
] END
La primera versión retorna result
donde
.
La segunda versión retorna el resultado para la primera
condición que es cierta. Si no hay ningún resultado
coincidente, el resultado tras value
=compare-value
ELSE
se
retorna, o NULL
si no hay parte
ELSE
.
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 caracteres, el resultado se retorna como cadena de
caracteres. 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
(
and expr1
<>
0
) entonces expr1
<> NULLIF()
retorna expr2
; de otro modo retorna
expr3
. IF()
retorna un valor numérico o cadena de caracteres, 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
o
expr3
es explícitamente
NULL
, el tipo del resultado de la función
IF()
es el mismo tipo que la expresión no
NULL
.
expr1
se evalúa como un valor entero, que
significa que si esta testeando valores de punto flotante o
cadenas de caracteres, 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 de IF(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 o expr3 retorna una cadena |
cadena de caracteres |
expr2 o expr3 retorna un valor de
coma flotante |
coma flotante |
expr2 o expr3 retorna un entero |
entero |
Si expr2
y expr3
son
cadenas de caracteres, el resultado es sensible a mayúsculas
si alguna de las cadenas lo es.
IFNULL(
expr1
,expr2
)
Si expr1
no es
NULL
, IFNULL()
retorna
expr1
, de otro modo retorna
expr2
. IFNULL()
retorna un valor numérico o de cadena de caracteres, 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(
es el más “general” de las dos expresiones, en
el orden expr1
,expr2
)STRING
, REAL
, o
INTEGER
. Considere el caso de una tabla
basada en expresiones o donde MySQL debe almacenar
internamente un valor retornado por
IFNULL()
en una tabla temporal:
mysql>CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
mysql>DESCRIBE tmp;
+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | test | varbinary(4) | NO | | | | +-------+--------------+------+-----+---------+-------+
En este ejemplo, el tipo de la columnatest
es VARBINARY(4)
.
NULLIF(
expr1
,expr2
)
Retorna NULL
si
es cierto, de otro
modo retorna expr1
=
expr2
expr1
. Es lo mismo que
CASE WHEN
.
expr1
=
expr2
THEN NULL ELSE
expr1
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.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.