Frage

In MySql, wenn das erste Argument einer IF () -Funktion eine Zeichenfolge ist, warum es falsch zurückgeben?

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

Natürlich könnte ich Art, dies zu beheben, wenn ich es täte

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

oder

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

Es scheint etwas kontraintuitiv, dass es eine Reihe der Art und Weise bewertet, dass es als

ist zu sehen,
SELECT IF(1, 'one', 'not one'); -- 'one'

und

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

bewerten die Art und Weise, dass sie es tun ...

War es hilfreich?

Lösung

MySQL

  

IF (expr1, expr2, expr3)

     

Wenn expr1 TRUE (expr1 <> 0 und expr1 <> NULL) dann IF () zurückkehrt   expr2; andernfalls gibt es expr3.   IF () gibt einen numerischen oder String   Wert, abhängig von dem Kontext, in   der sie verwendet wird.

So 1 ist wahr, weil 1! = 0 und 1! = NULL. Dies ist wie das, was Sie in C sehen würden.

Aber für eine Zeichenfolge, einen ‚Test‘ sagt wahr ausgewertet keine reale Grundlage in der Definition hat und macht keinen logischen Sinn. Es muss für ein boolean Ergebnis etwas verglichen werden.

Andere Tipps

Das erste Argument für IF() gegeben ist ein Prädikat . Ein String ist kein Prädikat von MySQL, so dass es standardmäßig auf false betrachtet. Was Ihren letzten Fall viele Sprachen (C, Perl, etc.) betrachten Null verschiedene ganze Zahlen wahr, so MySQL einfach ist dieses Paradigma zu unterstützen.

Weil ‚string‘ ist weder wahr noch falsch und der erste Ausdruck in einen Booleschen bewerten sollte.

Warum IF hat (1, ...) bewerten, um wahr? Gute Frage. Vielleicht ist eine Reminiszenz an C (das heißt, wenn es 1 ist, dann ist es wahr)?

EDIT: Eigentlich durch die 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, das ist der Fall, wenn expr1 == 1.

Beachten Sie, dass es Ähnlichkeiten in PHP:

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

Die Verwirrung scheint entstehen, weil MySQL auf 0 (und null) vergleicht den boolean-Wert von etwas zu bekommen. In anderen Sprachen wie PHP und Javascript, eine Zeichenfolge, wenn sie auf boolean werfen, gibt true zurück, wenn nicht leer ist (oder nicht "0").

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

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top