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 ...

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top