In MySQL perché questo IF restituisce false?
-
07-07-2019 - |
Domanda
In MySql, se il primo argomento di una funzione IF () è una stringa, perché restituisce false?
SELECT IF('string', 'string', 'not string'); -- 'not string'
Ovviamente potrei risolvere questo problema se lo facessi
IF(!ISNULL('string'), 'string', 'not string')) -- 'string'
o
IFNULL('string', 'not string'); -- 'string'
Sembra in qualche modo controintuitivo che valuta una stringa come se la vedesse come
SELECT IF(1, 'one', 'not one'); -- 'one'
e
SELECT IF('1', 'one', 'not one'); -- 'one'
valuta il modo in cui lo fanno ...
Soluzione
Da MySQL
IF (expr1, expr2, expr3)
Se expr1 è TRUE (expr1 < > 0 e expr1 < > NULL), allora IF () restituisce expr2; altrimenti restituisce expr3. IF () restituisce un numero o una stringa valore, a seconda del contesto in che viene utilizzato.
Quindi 1 è vero perché 1! = 0 e 1! = NULL. Questo è come quello che vedresti in C.
Ma per una stringa, dire che un 'test' viene valutato come vero non ha basi reali nella definizione e non ha senso logico. Deve essere paragonato a qualcosa per un risultato booleano.
Altri suggerimenti
Il primo argomento fornito a IF()
è un predicato . Una stringa non è considerata un predicato da MySQL, quindi per impostazione predefinita è false. Per quanto riguarda il tuo ultimo caso, molti linguaggi (C, Perl, ecc.) Considerano i numeri interi diversi da zero, quindi MySQL supporta semplicemente quel paradigma.
Perché 'stringa' non è né vero né falso e la prima espressione dovrebbe essere considerata un valore booleano.
Perché IF (1, ...) viene valutato come vero? Buona domanda. Forse un ritorno al C (cioè se è 1, allora è vero)?
EDIT: in realtà, dalla definizione del comando in http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if , expr1 è VERO se expr1 < > ; 0 e expr1 & Lt; & Gt; NULL, come nel caso di expr1 == 1.
Nota che ci sono somiglianze in PHP:
"string" != 0 // false
"one" != 0 // false
"1" != 0 // true
La confusione sembra sorgere perché MySQL si confronta con 0 (e null) per ottenere il valore booleano di qualcosa. In altre lingue, come PHP e Javascript, una stringa, quando viene lanciata in booleano, restituisce true quando non è vuota (o meno & Quot; 0 & Quot;).
// php
0 == true // false
"string" == 0 // true*
"string" == true // true
// mysql
if(0, "true", "false") // false
if("string", "true", "false") // false*
Le due *
righe speciali <=> mostrano i confronti equivalenti, se sai cosa intendo.