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
TIMESTAMPoDATETIMEy 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_nameWHEREstr_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 deNULLsi ambos operandos sonNULL, y 0 en lugar deNULLsi 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; -> 0IS,valor booleanoIS NOTvalor booleanoComprueba si un valor contra un valor booleano, dondeboolean_valuepuede 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, 0IS [NOT]sintaxis se añadió en MySQL 5.0.2.valor booleanoIS NULL,IS NOT NULLTestea 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, 0Para poder trabajar con programas ODBC, MySQL soporta las siguientes características extra al usarIS NULL:- Puede encontrar el registro que contiene el valor
AUTO_INCREMENTmás reciente realizando un comando de la siguiente forma inmediatamente tras generar el valor:SELECT * FROM
tbl_nameWHEREauto_colIS NULLEste comportamiento puede desactivarse asignandoSQL_AUTO_IS_NULL=0. Consulte Sección 13.5.3, “Sintaxis deSET”. - Para columnas
DATEyDATETIMEque se declaran comoNOT NULL, puede encontrar la fecha especial'0000-00-00'con un comando como este:SELECT * FROM
tbl_nameWHEREdate_columnIS NULLEsto es necesario para algunas aplicaciones ODBC, ya que ODBC no soporta un valor de fecha'0000-00-00'.
exprBETWEENminANDmaxSiexpres mayor o igual queminyexpres menor o igual amax,BETWEENretorna1, 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<=exprANDexpr<=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'; -> 0exprNOT BETWEENminANDmaxEsto es lo mismo queNOT (.exprBETWEENminANDmax)COALESCE(value,...)Retorna el primer valore noNULLde la lista.mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULLGREATEST(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'exprIN (value,...)Retorna1siexpres 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 queINes muy rápido si la listaINconsiste enteramente en constantes. Siexpres 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'); -> 1El número de valores en la listaINsólo está limitado por el valormax_allowed_packet.En MySQL 5.0, para cumplir el estándar SQLINretornaNULLno 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,INySOME”.exprNOT IN (value,...)Esto es lo mismo queNOT (.exprIN (value,...))ISNULL(expr)SiexpresNULL,ISNULL()retorna1, sino retorna0.mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1Una comparación de valoresNULLusando=siempre es falsa.La funciónISNULL()comparte algunos comportamientos especiales con el operador de comparaciónIS NULL, consulte la descripción deIS NULLen Sección 12.1.3, “Funciones y operadores de comparación”.INTERVAL(N,N1,N2,N3,...)Retorna0ifN<N1,1siN<N2y así o-1siNesNULL. Todos los argumentos se tratan como enteros. Esto requiere queN1<N2<N3<...<Nnpara 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); -> 0LEAST(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
INTEGERo todos los argumentos son enteros, se comparan como enteros. - Si el valor retornado se usa en un contexto
REALo 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); -> -9223372036854775808Esto ocurre porque MySQL lee9223372036854775808.0en 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