最も可能性の高い説明は、WHERE句の述語を満たす行がないことです。where句の形式は次のとおりです。
( a AND ( b OR c ) ) OR d
どこ
a = companies.status = 'active'
b = companies.status_override = ''
c = companies.status_override = NULL
d = companies.status_override = 'active'
したがって、基本的に、条件を満たす行がテーブルにないことがわかりますd
。a
そして、条件と。の両方を満たす行がないことを私たちは知っていますb
。
条件c
は不可能です。それは決して満足されません。
式にNULLが含まれているかどうかをテストするには、を使用しますexpr IS NULL
。すなわち
companies.status_override IS NULL
status_override列でのインデックス範囲スキャン操作に関心がない場合(そうでない可能性があります)、IFNULL()関数を使用して少し単純化できます...
(companies.status = 'active' AND IFNULL(companies.status_override,'') = '') OR companies.status_override = 'active'
またはNULLIF()
関数を使用する
(companies.status = 'active' AND NULLIF(companies.status_override,'') IS NULL) OR companies.status_override = 'active'