2013-04-26 10 views
17

Ich bin nur neugierig. Ich weiß, über NULL sicher gleich Operator < =>, aber gibt es einige NULL sicher nicht gleich Operator, oder muss ich immer so etwas verwenden:MySQL - NULL sicher nicht gleich Operator

(tab.id != 1 OR tab.id IS NULL) 

oder jemand zieht

!(tab.id <=> 1) 

Antwort

7
COALESCE(tab.id, 0) != 1 

Kann hier verwendet werden, wenn es Ihnen gefällt. Ich gehe durch die Parameter und gebe den ersten Wert zurück, der nicht NULL ist. In diesem Fall, wenn es NULL ist, wird es 0 != 1 vergleichen. Obwohl es mehr Zeichen verwenden kann, ist es immer noch einfacher zu verwalten, anstatt gezwungen zu sein, in diesen Fällen immer entgegengesetzte "boolesche" Lösungen zu haben.

lesen Dokumentation für COALESCE()

+0

Ich denke, dies ist die bevorzugte Methode, da diese Abfrage auch auf SQL Server funktioniert. Die beste Methode ist, keine Nullen zu haben und einen korrekten Standard zu haben, aber die Quellendaten können nicht immer vom Entwickler kontrolliert werden. –

+3

Leider, wenn Sie den Wert auf der RHS dieses Vergleichs nicht kennen, wissen Sie nicht, was zu COALESCE() Ihr NULL ist! – Arth

+0

Dies funktioniert, wenn Sie tab.id mit einem Wert vergleichen möchten, aber es funktioniert nicht, wenn Sie zwei Felder wie tab.id mit tab_childs.tab_id vergleichen möchten. –

8

fand ich, dass NOT (NULL < => 1) arbeitet, und ich denke, es ist auch ISO-Standard kompatibel ist, ist aber umständlich. Ein besserer Weg, um zu zeigen, Spaltennamen so sein würde: NOT (tbl.col1 < => 1)

+2

'<=>' ist nicht Standard-SQL, es ist eine MySQL-Erweiterung. Der standardmäßige äquivalente null-sichere Vergleich ist typischerweise für SQL viel ausführlicher: "IS [NOT] DISTINCT FROM". –

0

Wenn Sie wissen, dass die RHS des Vergleichs IS NOT NULL:

COALESCE(tab.id != 1, 1) 

Oder

COALESCE(tab.id != 1, TRUE) 

wird Ihnen das richtige Ergebnis geben.

Ob dies besser besser lesbar als:

(tab.id != 1 OR tab.id IS NULL) 

fraglich ..

Ich würde auch zuerst mit Vergleichen die NULL Logik, um herauszufiltern versucht sein, so dass ich nicht haben Denken Sie an sie! Ich würde wahrscheinlich Ihre erste Gleichung schreiben als:

(tab.id IS NULL OR tab.id != 1) 

Leistung auf Prävalenz von NULL s jedoch ab.

1

Jetzt MySQL hat keine NULL-Safe nicht gleich Betreiber.

Mit MySQL die universellste Lösung ist:

!(tab.id <=> 1) 

oder

NOT tab.id <=> 1 

, weil es richtig anstelle von 1 wird funktionieren, wenn auch Sie werden NULL verwenden.