2016-11-05 10 views

Antwort

1

Abfrage wird einfach zurückgeben 1, wenn elevation> oder = 2000 ist, sonst es NULL zurückkehren wird (dies ist für boolean Darstellung des Feldes voll nutzen, weil NULL darstellt), Der jetzt zurückgegebene Wert wird in count_high_elevation_airports gesetzt.

+0

'NULL' steht hier nicht für" 0 ", und 1 entspricht booleschem Wahr ist nur zufällig. Ich glaube, Sie haben möglicherweise die Tatsache übersehen, dass hier eine Aggregatfunktion verwendet wird, oder vielleicht eine der Konsequenzen, die damit verbunden sind. –

2

Zuerst beachten Sie, dass diese drei Ausdrücke sind equivent:

CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END 
IF(elevation >= 2000, 1, NULL) 
((elevation >= 2000) OR NULL) 

Wenn Erhebung> = 2000, der Ausdruck auswertet als "1", andernfalls wird der Ausdruck auswertet als NULL.

"1" wird normalerweise als Boolean True verwendet, und Sie könnten das MySQL-Literal TRUE in den obigen Ausdrücken mit äquivalenten Ergebnissen ersetzen ... aber dafür steht die "1" hier nicht.

Wenn mit COUNT() verwendet, in Fällen wie diesen, ist die einzige wirkliche Bedeutung von 1 ist, dass es nicht NULL ist.

Dies ist wichtig, weil - entgegen der landläufigen Meinung - COUNT() Zeilen nicht zählt. Es zählt Werte.

Was ist der Unterschied? NULL ist technisch kein Wert. Stattdessen ist es ein Marker, der die Abwesenheit eines Werts angibt, also COUNT(expr) zählt nur Zeilen, wobei expr nicht null ist.

Mit einem Ausdruck wie dem hier, Sie bitten den Server, die Zeilen mit Höhe => 2000 zu zählen, und Sie geben COUNT() eine NULL für Zeilen, die nicht gezählt werden sollen ... und ein Nicht-Null-Wert für Zeilen, die Sie tun.

Aggregate (GROUP BY) functions arbeiten auf Werte - und NULL, wieder, ist kein Wert in diesem Sinne.

Eine weitere Aggregatfunktion, die diese Begründung vielleicht noch deutlicher macht, ist AVG(). Wenn du 3 Zeilen hast ... mit den Werten 5, NULL und 10 ... was ist der Durchschnitt? Wenn Sie 7.5 sagten, ist das richtig: Der Durchschnitt dieser 3 Zeilen ist (5 + 10) ÷ 2 = 5, weil die 3 Zeilen nur zwei Werte haben. NULL ist nicht 0, sonst wäre der Durchschnitt (5 + 0 + 10) ÷ 3 = 5, was nicht der Fall ist.

Also, so funktioniert und warum das funktioniert.

Wie wirkt sich dieser Wert '1' nach auf den Ausgang aus?

Es ist wirklich nicht. Sie könnten genauso gut COUNT(CASE WHEN elevation >= 2000 THEN 'cat videos are funny' ELSE NULL END) gesagt haben, weil genau wie das Literal 1 die Literalzeichenfolge 'cat videos are funny' auch nicht null ist und Werte ungleich null - alles nicht null - zählen.

Ein Anfänger könnte versuchen, diese Aufgabe mit COUNT(elevation >= 2000) zu erreichen, aber das gibt die falsche Antwort, weil die 0 (falsch) für Zeilen, in denen Erhebung ist < 2000 nicht null ist, so dass diese Zeilen noch gezählt werden würden. Sie können dann fragen: "Warum nicht einfach COUNT(*) ... WHERE elevation >= 2000 verwenden?" Gute Frage. Die Gründe variieren, aber wenn Sie GROUP BY state und es gibt Staaten mit keine Zeilen, die WHERE entsprechen, würden diese Staaten vollständig aus den Ergebnissen eliminiert werden, was oft nicht das ist, was Sie wollen. Diese Abfrage enthält sie mit einer Anzahl von null.


Beachten Sie, dass ((elevation >= 2000) OR NULL), der dritte Beispiel Ausdruck an der Spitze, muss nicht tatsächlich die Klammern. Ich habe sie eingefügt, weil diese Form auf den ersten Blick nicht unbedingt intuitiv ist. Der natürliche Vorrang von Operationen führt dazu, dass dies korrekt bewertet wird, wenn einfach elevation >= 2000 OR NULL geschrieben wird. Dieser Ausdruck ist äquivalent zu den anderen beiden, da elevation >= 2000 zuerst 1 ergibt, wenn es wahr ist, 0 wenn falsch, oder NULL, wenn die Höhe null ist. Dann wird die niedrigere Priorität OR ausgewertet, und Sie erhalten eine von diesen: 1 OR NULL => 1 ... 0 OR NULL => NULL ... NULL OR NULL => NULL ... und Sie können tatsächlich eine SQL-Assistent-Abzeichen von den Ältesten des Internets an der Stelle, wenn Abfragen geschrieben werden mit COUNT(elevation >= 2000 OR NULL) kommt natürlich zu dir.

Verwandte Themen