2016-04-18 13 views
2

Ich habe eine CASE WHEN Funktion in meiner Abfrage. Etwas wie folgt aus:MySQL: Was passiert, wenn etwas mit NULL gleich ist?

CASE WHEN h.user_id = :user_id THEN '1' 
    ELSE '0' 
END paid 

Und ich pass :user_id wie folgt aus:

$sth->bindValue(":user_id", $user_id, PDO::PARAM_INT); 

Nun, manchmal ist $user_idNULL. Ich habe schon gehört, wenn etwas mit NULL in der Abfrage gleich ist, wird etwas Schlimmes passieren. Jetzt möchte ich wissen, was passiert, wenn $user_idNULL ist?

Ich habe es getestet, aber alles in Ordnung, ich sehe kein Problem. Wenn $user_id ist NULL, $result['paid'] ist 1 oder dass CASE..WHEN bricht?


EDIT:

Alles, was ich will es tun, wenn h.user_id = :user_id dann paid = 1. Aber manchmal ist :user_idnull. Wie kann ich entkommen null?

Antwort

6

Das Problem, das Sie stoßen, weil, nach der Norm, ein Ergebnis von etwas null Vergleich gibt null, die schließlich zu false dazu gezwungen werden. So wird Ihr Ausdruck, wie geschrieben, immer 0 zurückgeben, wenn entweder :user_id oder h.user_idnull ist.

Glücklicherweise tritt diese Situation oft genug auf, dass MySQL ein wenig syntaktischen Zucker namens "spaceship" or "NULL-safe equal" operator bereitstellt, der wie <=> aussieht. Es wird verwendet, genau wie bei den normalen = Bediener, mit der Ausnahme, dass es kehrt false (nicht null), wenn ein null zu einem nicht null und true Vergleich, wenn zwei null vergleicht.

Der Ausdruck wird dann

CASE WHEN h.user_id <=> :user_id THEN '1' 
    ELSE '0' 
END paid 
1

Wenn der übergebene Parameter wirklich ein Nullwert ist, dann sollte das Ergebnis des Case-Ausdrucks 0 sein, weil null nicht mit einem des Feldwert gleich sein, so dass die else-Zweig muss einspringen. Es gibt keine Notwendigkeit, Nullwerte zu umgehen.

Um in geeigneter Weise Null-Wert von PHP übergeben mysql PDO mit siehe this SO topic