先日SQLを書いていたところ、どうにも SELECTがうまくできていないようだったので、色々調べていたところ、 <>
を誤って理解していたことに気づいた。
TLDL;
-
<>
は NULLではない値 に対して、左と右のオペランドを評価する
勘違いしていたこと
例)
SELECT *
FROM user
WHERE company_id <> 100
AND is_admin = 1
ここで、company_idがnullも許可している。
想定ではcompany_idが100ではない admin ユーザを取得したい
company_idがnullではない場合
30 <> 100
が評価されるので、 is_admin=1
のuserが全て取得できる
company_idがnullの場合
通常のプログラミングと同様に null != 100
とはならず、company_idがnullの場合はそのuserを取得できない。Not equalの演算は nullではない値 に対して評価が行われる。
解決策
SELECT *
FROM user
WHERE (company_id IS NULL OR company_id <> 100)
AND is_admin = 1
company_idがnullだったら取得するし、nullではなければ 100ではないかチェックする。
これで想定通りのselectができた。