2016-10-13 7 views
0

ich eine SQL-Anweisung haben, wo ich eine Spalte prüfen Sie, das Wort ‚rufen‘ zu machen, ist es nicht so:Was die Begründung dieser SQL-Syntax ist

select * from TableName where PFSeat <> 'call' 

Aber diese Aussage nicht enthalten Datensätze, bei denen PFSeat ist Null. Um alle Datensätze zu bekommen Ich brauche ich habe die Erklärung zu ändern, dies ist es

select * from TableName where (PFSeat <> 'call' OR PFSeat Is Null) 

aussehen wie ein Grund, warum es codiert, wo ich nicht alle Datensätze ich von der ersten Anweisung müssen? Was ist der Grund?

+1

Nicht alle DBMS gleich geschaffen sind. Oracle zum Beispiel gibt 'null' nicht mit einem '<>' – JohnHC

+4

Der Grund ist, dass 'null' ein sehr spezieller Nicht-Wert ist, der nicht mit' = 'oder' <> 'verglichen werden kann. So wurde SQL vor 30 Jahren definiert. Aber Sie können die Bedingung zu vereinfachen, wo PFSeat unterscheidet sich von Call ' –

+0

Per Definition ist jeder andere Operator als IS NULL mit einem NULL-Wert verwendet FALSE. Und Oracle ist keine Ausnahme von dieser Regel. –

Antwort

1

Sie könnten (und sollten) die erste Anweisung als "alle Zeilen lesen, in denen PFSeat einen Wert hat, und dieser Wert ist nicht 'call'".
Es ergibt sich aus einer vor mehreren Jahrzehnten getroffenen Wahl, dass NULLkein Wert ist, aber das Fehlen eines Wertes. Die meisten, wenn nicht alle DBMS halten sich an diese Regel, sonst würden viele Abfragen zu unerwarteten Ergebnissen führen.

Also NULL ist kein Wert, es ist eine Eigenschaft, die bedeutet, dass kein Wert vorhanden ist.
Viele Klauseln in SQL, in denen irgendein Teil oder Parameter NULL ist, werden per Definition NULL erzeugen.

Verwandte Themen