No MySQL porque é que esta se devolver falso?
-
07-07-2019 - |
Pergunta
No MySQL, se o primeiro argumento de uma função IF () é uma cadeia, por que ele retornar falso?
SELECT IF('string', 'string', 'not string'); -- 'not string'
Claro que eu poderia tipo de correção isso, se eu fiz
IF(!ISNULL('string'), 'string', 'not string')) -- 'string'
ou
IFNULL('string', 'not string'); -- 'string'
Parece um pouco contra-intuitivo que avalia uma string a maneira que ele vê como
SELECT IF(1, 'one', 'not one'); -- 'one'
e
SELECT IF('1', 'one', 'not one'); -- 'one'
avaliar a maneira que eles fazem ...
Solução
A partir MySQL
IF (expr1, expr2, expr3)
Se expr1 é verdade (Expr1 <> 0 e Expr1 <> NULL), em seguida, IF () retorna expr2; caso contrário ele retorna expr3. IF () retorna um valor numérico ou string valor, dependendo do contexto em qual ele é usado.
Assim 1 é verdade porque 1! = 0 e 1! = NULL. Isto é como o que você veria em C.
Mas para uma string, dizendo que uma avalia 'teste' para true não tem base real na definição e não faz sentido lógico. Ele precisa ser comparado a algo para um resultado boolean.
Outras dicas
O primeiro argumento dado a IF()
é um predicado . Uma cadeia não é considerado um predicado pelo MySQL, por isso o padrão é falso. Quanto ao seu último caso, um monte de línguas (C, Perl, etc) consideram números inteiros diferentes de zero verdadeiro, assim MySQL é simplesmente apoiar esse paradigma.
Porque 'string' é nem verdadeiro nem falso e a primeira expressão deve ser avaliada como um boolean.
Por que IF (1, ...) avaliar a verdade? Boa pergunta. Talvez um retrocesso para C (ou seja, se é 1, então é verdade)?
EDIT: Na verdade, pela definição do comando em http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if , expr1 é TRUE se expr1 <> 0 e expr1 <> NULL, que é o caso quando expr1 == 1.
Note que existem semelhanças em PHP:
"string" != 0 // false
"one" != 0 // false
"1" != 0 // true
A confusão parece surgir como o MySQL se compara a 0 (e null) para obter o valor booleano de algo. Em outras linguagens, como PHP e Javascript, uma string, quando fundido para booleano, retorna verdadeiro quando não vazio (ou não "0").
// php
0 == true // false
"string" == 0 // true*
"string" == true // true
// mysql
if(0, "true", "false") // false
if("string", "true", "false") // false*
As duas linhas *
starred*
mostrar as comparações equivalentes, se você sabe o que quero dizer.