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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top