2 Stimmen

Warum gibt dieser IF in MySQL false zurück?

Wenn in MySql das erste Argument einer IF()-Funktion eine Zeichenkette ist, warum gibt sie dann false zurück?

SELECT IF('string', 'string', 'not string'); -- 'not string'

Natürlich könnte ich das irgendwie in Ordnung bringen, wenn ich es täte.

IF(!ISNULL('string'), 'string', 'not string')) -- 'string'

oder

IFNULL('string', 'not string'); -- 'string'

Es scheint etwas kontraintuitiv zu sein, dass eine Zeichenkette auf diese Weise ausgewertet wird, da sie

SELECT IF(1, 'one', 'not one'); -- 'one'

et

SELECT IF('1', 'one', 'not one'); -- 'one'

die Art und Weise zu bewerten, wie sie es tun...

6voto

Gavin H Punkte 10060

En MySQL

WENN(expr1,expr2,expr3)

Wenn expr1 WAHR ist (expr1 <> 0 a expr2 zurück; andernfalls gibt es expr3 zurück. IF() gibt einen numerischen oder einen String Wert zurück, je nachdem, in welchem Kontext Kontext, in dem sie verwendet wird.

1 ist also wahr, weil 1 != 0 und 1 != NULL. Dies entspricht dem, was Sie in C sehen würden.

Aber bei einer Zeichenkette hat die Aussage, dass ein "Test" als wahr ausgewertet wird, keine wirkliche Grundlage in der Definition und macht keinen logischen Sinn. Für ein boolesches Ergebnis muss es mit etwas verglichen werden.

5voto

Evan Meagher Punkte 4307

Das erste Argument, das an IF() ist ein Prädikat . Eine Zeichenkette wird von MySQL nicht als Prädikat betrachtet, daher ist es standardmäßig false. Was Ihren letzten Fall betrifft, so betrachten viele Sprachen (C, Perl usw.) ganze Zahlen ungleich Null als wahr, so dass MySQL einfach dieses Paradigma unterstützt.

2voto

Michael Todd Punkte 16235

Denn "string" ist weder wahr noch falsch und der erste Ausdruck sollte einen booleschen Wert ergeben.

Warum ergibt IF(1, ...) den Wert true? Gute Frage. Vielleicht ein Rückgriff auf C (d.h. wenn es 1 ist, dann ist es wahr)?

EDIT: Nach der Definition des Befehls unter http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if expr1 ist TRUE, wenn expr1 <> 0 und expr1 <> NULL ist, was der Fall ist, wenn expr1 == 1 ist.

1voto

nickf Punkte 517253

Beachten Sie, dass es in PHP Ähnlichkeiten gibt:

"string" != 0 // false
"one"    != 0 // false
"1"      != 0 // true

Die Verwirrung scheint zu entstehen, weil MySQL mit 0 (und null) vergleicht, um den booleschen Wert von etwas zu erhalten. In anderen Sprachen wie PHP und Javascript gibt eine Zeichenkette, wenn sie in einen booleschen Wert umgewandelt wird, true zurück, wenn sie nicht leer (oder nicht "0") ist.

// php
0 == true          // false
"string" == 0      // true*
"string" == true   // true

// mysql
if(0, "true", "false")   // false
if("string", "true", "false") // false*

Die beiden * Sternchen * Linien zeigen die entsprechenden Vergleiche, wenn Sie wissen, was ich meine.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X