En MySQL, ¿por qué este IF devuelve falso?
-
07-07-2019 - |
Pregunta
En MySql, si el primer argumento de una función IF () es una cadena, ¿por qué devuelve falso?
SELECT IF('string', 'string', 'not string'); -- 'not string'
Por supuesto que podría arreglar esto si lo hiciera
IF(!ISNULL('string'), 'string', 'not string')) -- 'string'
o
IFNULL('string', 'not string'); -- 'string'
Parece algo contra-intuitivo que evalúa una cadena de la forma en que lo ve como
SELECT IF(1, 'one', 'not one'); -- 'one'
y
SELECT IF('1', 'one', 'not one'); -- 'one'
evaluar la forma en que lo hacen ...
Solución
De MySQL
IF (expr1, expr2, expr3)
Si expr1 es VERDADERO (expr1 < > 0 y expr1 < > NULL), entonces IF () devuelve expr2; de lo contrario, devuelve expr3. IF () devuelve un número o cadena valor, dependiendo del contexto en cuál se usa.
Entonces 1 es verdadero porque 1! = 0 y 1! = NULL. Esto es como lo que verías en C.
Pero para una cadena, decir que una 'prueba' se evalúa como verdadera no tiene una base real en la definición y no tiene sentido lógico. Debe compararse con algo para obtener un resultado booleano.
Otros consejos
El primer argumento dado a IF()
es un predicado . MySQL no considera un predicado, por lo que su valor predeterminado es falso. En cuanto a su último caso, muchos lenguajes (C, Perl, etc.) consideran que los enteros distintos de cero son verdaderos, por lo que MySQL simplemente admite ese paradigma.
Porque 'string' no es ni verdadero ni falso y la primera expresión debe evaluarse como booleana.
¿Por qué IF (1, ...) se evalúa como verdadero? Buena pregunta. ¿Tal vez un retroceso a C (es decir, si es 1, entonces es cierto)?
EDITAR: en realidad, según la definición del comando en http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if , expr1 es VERDADERO si expr1 < > ; 0 y expr1 & Lt; & Gt; NULL, que es el caso cuando expr1 == 1.
Tenga en cuenta que hay similitudes en PHP:
"string" != 0 // false
"one" != 0 // false
"1" != 0 // true
La confusión parece surgir porque MySQL se compara con 0 (y nulo) para obtener el valor booleano de algo. En otros lenguajes, como PHP y Javascript, una cadena, cuando se convierte en booleano, devuelve verdadero cuando no está vacío (o no & Quot; 0 & Quot;).
// php
0 == true // false
"string" == 0 // true*
"string" == true // true
// mysql
if(0, "true", "false") // false
if("string", "true", "false") // false*
Las dos líneas *
destacadas <=> muestran las comparaciones equivalentes, si sabes a lo que me refiero.