2016-04-18 28 views
2

我的查詢中有一個CASE WHEN函數。事情是這樣的:MySQL:當NULL與NULL相等時會發生什麼?

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

而且我通過:user_id這樣的:

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

嗯,有時候$user_idNULL。我已經聽到在查詢中有什麼東西與NULL相等時,會發生不好的事情。現在我想知道,$user_idNULL會發生什麼?

我測試過了,但都很好,我沒有看到任何問題。當$user_idNULL,$result['paid']1CASE..WHEN是否中斷?


編輯:

所有我想這樣做,當h.user_id = :user_id然後paid = 1。但有時:user_idnull。我怎樣才能逃脫null

回答

6

您遇到的問題是因爲,根據標準,任何比較null給出null,最終被裹挾false結果。因此,您的表達如書面所示,當:user_idh.user_idnull時將始終返回0

幸運的是,這種情況經常出現,MySQL提供了一些名爲"spaceship" or "NULL-safe equal" operator的語法糖,看起來像<=>。它被用來完全一樣的正常操作者=,不同之處在於它返回false(未null)進行比較的null到非null,和true當比較兩個null時。

表達然後變成

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

如果傳遞的參數是一個真正的空值,則該情況下表達的結果應該是0,因爲空不會與任何字段值相等,所以否則分支必須踢。沒有必要轉義空值。

爲了適當地將空值從php傳遞到使用PDO的mysql,請參閱this SO topic

相關問題