12.1.3. Funciones y operadores de comparación
Las operaciones de comparación dan un valor de
1
(CIERTO), 0
(FALSO), o NULL
. Estas operaciones funcionan tanto para números como para cadenas de caracteres. Las cadenas de caracteres se convierten automáticamente en números y los números en cadenas cuando es necesario.
Algunas de las funciones de esta sección (tales como
LEAST()
y GREATEST()
) retornan valores distintos a 1
(CIERTO), 0
(FALSO), o NULL
. Sin embargo, el valor que retornan se basa en operaciones de comparación realizadas como describen las siguientes reglas.
MySQL compara valores usando las siguientes reglas:
- Si uno o ambos argumentos son
NULL
, el resultado de la comparación esNULL
, excepto para el operador de comparaciónNULL
-safe<=>
. - Si ambos argumentos en una operación de comparación son cadenas, se comparan como cadenas.
- Si ambos argumentos son enteros, se comparan como enteros.
- Los valores hexadecimales se tratan como cadenas binarias si no se comparan con un número.
- Si uno de los argumentos es una columna
TIMESTAMP
oDATETIME
y el otro argumento es una constante, la constante se convierte en timestamp antes de realizar la comparación. Esto se hace para acercarse al comportamiento de ODBC. Esto no se hace para argumentos enIN()
! Para estar seguro, siempre use cadenas completas de fechas/horas al hacer comparaciones. - En todos los otros casos, los argumentos se comparan como números con punto flotante (reales).
Por defecto, la comparación de cadenas no es sensible a mayúsculas y usa el conjunto de caracteres actual (ISO-8859-1 Latin1 por defecto, que siempre funciona bien para inglés).
Par convertir un valor a un tipo específico para una comparación, puede usar la función
CAST()
. Los valores de cadenas de caracteres pueden convertirse a un conjunto de caracteres distinto usando CONVERT()
. ConsulteSección 12.8, “Funciones y operadores de cast”.
Los siguientes ejemplos ilustran conversión de cadenas a números para operaciones de comparación:
mysql> SELECT 1 > '6x'; -> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1
Tenga en cuanta que cuando compara una columna de cadenas de caracteres con un número, MySQL no puede usar el índice de la columna para buscar rápidamente le valor. Si
str_col
es una columna de cadenas indexada, el índice no puede usarse al realizar la búsqueda en el siguiente comando:SELECT * FROMtbl_name
WHEREstr_col
=1;
La razón es que hay diferentes cadenas que pueden convertirse al valor
1
: '1'
, ' 1'
, '1a'
, ...=
Igual:mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 1
<=>
NULL
-safe equal. Este operador realiza una comparación de igualdad como el operador=
, pero retorna 1 en lugar deNULL
si ambos operandos sonNULL
, y 0 en lugar deNULL
si un operando esNULL
.mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL
<>
,!=
Diferente:mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
<=
Menor que o igual:mysql> SELECT 0.1 <= 2; -> 1
<
Menor que:mysql> SELECT 2 < 2; -> 0
>=
Mayor que o igual:mysql> SELECT 2 >= 2; -> 1
>
Mayor que:mysql> SELECT 2 > 2; -> 0
IS
,valor booleano
IS NOT
valor booleano
Comprueba si un valor contra un valor booleano, dondeboolean_value
puede serTRUE
,FALSE
, oUNKNOWN
.mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1 mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 1, 1, 0
IS [NOT]
sintaxis se añadió en MySQL 5.0.2.valor booleano
IS NULL
,IS NOT NULL
Testea si un valor es o noNULL
.mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0, 0, 1 mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0
Para poder trabajar con programas ODBC, MySQL soporta las siguientes características extra al usarIS NULL
:- Puede encontrar el registro que contiene el valor
AUTO_INCREMENT
más reciente realizando un comando de la siguiente forma inmediatamente tras generar el valor:SELECT * FROM
tbl_name
WHEREauto_col
IS NULLEste comportamiento puede desactivarse asignandoSQL_AUTO_IS_NULL=0
. Consulte Sección 13.5.3, “Sintaxis deSET
”. - Para columnas
DATE
yDATETIME
que se declaran comoNOT NULL
, puede encontrar la fecha especial'0000-00-00'
con un comando como este:SELECT * FROM
tbl_name
WHEREdate_column
IS NULLEsto es necesario para algunas aplicaciones ODBC, ya que ODBC no soporta un valor de fecha'0000-00-00'
.
expr
BETWEENmin
ANDmax
Siexpr
es mayor o igual quemin
yexpr
es menor o igual amax
,BETWEEN
retorna1
, de otro modo retorna0
. Esto es equivalente a la expresión(
si todos los argumentos son del mismo tipo. De otro modo la conversión de tipos tiene lugar según las reglas descritas al principio de la sección, pero aplicadas a todos los argumentos.min
<=expr
ANDexpr
<=max
)mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0
expr
NOT BETWEENmin
ANDmax
Esto es lo mismo queNOT (
.expr
BETWEENmin
ANDmax
)COALESCE(
value
,...)Retorna el primer valore noNULL
de la lista.mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
GREATEST(
value1
,value2
,...)Con dos o más argumentos, retorna el argumento mayor (con valor mayor). Los argumentos se comparan usando las mismas reglas que paraLEAST()
.mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> SELECT GREATEST('B','A','C'); -> 'C'
expr
IN (value
,...)Retorna1
siexpr
es uno de los valores en la listaIN
, de lo contrario retorna0
. Si todos los valores son constantes, se evalúan según el tipo y ordenación deexpr
. La búsqueda para el elemento se hace usando búsqueda binaria. Esto significa queIN
es muy rápido si la listaIN
consiste enteramente en constantes. Siexpr
es una expresión de cadenas de caracteres sensible a mayúsculas, la comparación de cadenas se realiza sensible a mayúsculas.mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
El número de valores en la listaIN
sólo está limitado por el valormax_allowed_packet
.En MySQL 5.0, para cumplir el estándar SQLIN
retornaNULL
no sólo si la expresión de la parte izquierda esNULL
, también si no encuentra coincidencias en la lista y una de las expresiones en la lista esNULL
.La sintaxis deIN()
puede usarse para escribir algunas subconsultas. Consulte Sección 13.2.8.3, “Subconsultas conANY
,IN
ySOME
”.expr
NOT IN (value
,...)Esto es lo mismo queNOT (
.expr
IN (value
,...))ISNULL(
expr
)Siexpr
esNULL
,ISNULL()
retorna1
, sino retorna0
.mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
Una comparación de valoresNULL
usando=
siempre es falsa.La funciónISNULL()
comparte algunos comportamientos especiales con el operador de comparaciónIS NULL
, consulte la descripción deIS NULL
en Sección 12.1.3, “Funciones y operadores de comparación”.INTERVAL(
N
,N1
,N2
,N3
,...)Retorna0
ifN
<N1
,1
siN
<N2
y así o-1
siN
esNULL
. Todos los argumentos se tratan como enteros. Esto requiere queN1
<N2
<N3
<...
<Nn
para que la función funcione correctamente. Esto es porque se usa una búsqueda binaria (muy rápida).mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0
LEAST(
value1
,value2
,...)Con dos o más argumentos, retorna el argumento menor (con un valor menor). Los argumentos se comparan usando las siguientes reglas:- Si el valor retornado se usan en un contexto
INTEGER
o todos los argumentos son enteros, se comparan como enteros. - Si el valor retornado se usa en un contexto
REAL
o todos los argumentos son reales, se comparan como reales. - Si algún argumento es una cadena de caracteres sensible a mayúsculas, los argumentos se comparan como cadenas sensibles a mayúsculas.
- En cualquier otro caso, los argumentos se comparan como cadenas no sensibles a mayúsculas.
mysql> SELECT LEAST(2,0); -> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> SELECT LEAST('B','A','C'); -> 'A'
Tenga en cuenta que las reglas de conversión precedentes pueden producir resultados extraños en algunos casos extremos:mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808
Esto ocurre porque MySQL lee9223372036854775808.0
en un contexto entero. La representación entera no es lo bastante buena para tratar el valor, así que lo cambia a entero con signo.Referencia
No hay comentarios.:
Publicar un comentario