2016-04-18 20 views
2

私はクエリにCASE WHEN関数を持っています。このような何か:MySQL:何かがNULLと等しい場合はどうなりますか?

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

そして、私はこのような:user_idを渡す:時々$user_idNULLで、まあ

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

。既に何かがクエリでNULLと等しい時に聞いたが、何か悪いことが起こります。今私が知りたいのは、$user_idNULLのときどうなるでしょうか?

私はそれをテストしましたが、問題はありません。 $user_idNULLの場合、$result['paid']1、またはCASE..WHENが壊れていますか?


EDIT:

私はそれをしたいすべて、h.user_id = :user_idその後、paid = 1。しかし時々:user_idnullです。どうすればnullをエスケープできますか?

答えて

6

標準によると、nullに何かを比較する最終的falseに強制変換されますnull、結果を与え、ので、あなたが直面している問題があります。 :user_idまたはh.user_idいずれかがnullときにこのように、あなたの表現は、書かれたとして、常に0を返します。

幸いにも、この状況は、"spaceship" or "NULL-safe equal" operatorと呼ばれる少しの構文砂糖をMySQLが提供するほどよく発生します。これは<=>のように見えます。それは、二つnullを比較した場合、非null、及びtruenullを比較するとき、それは(ないnullfalseを返すことを除いて、正確に正常=オペレータように使用されます。

渡されたパラメータがヌルフィールド値のいずれかと等しくならないので、次にcase式の結果が0でなければならない、真にヌル値であり、そうである場合、発現は、その後

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

となりますそうでない場合はブランチを起動する必要があります。ヌル値をエスケープする必要はありません。

PDOを使用してphpからmysqlにnull値を適切に渡すには、this SO topic

を参照してください。