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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top