0

次の完全なクエリがありますが、何も返されません。

@companies.where("(companies.status = 'active' AND (companies.status_override = '' OR companies.status_override = NULL)) OR companies.status_override = 'active'")

最初の部分では、「アクティブ」に設定され、何も設定されていない(companies.status = 'active' AND (companies.status_override = '' OR companies.status_override = NULL))すべてのアイテムが返されると思います。statusstatus_override

4

2 に答える 2

2

DB構造を知らなくても、= NULLは疑わしいです。IS NULL代わりに試してください。

NULLとの算術比較は、期待どおりに動作しません。詳細については、Mysqlリファレンスを参照してください。

于 2012-07-18T15:14:40.273 に答える
1

最も可能性の高い説明は、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'

したがって、基本的に、条件を満たす行がテーブルにないことがわかりますdaそして、条件と。の両方を満たす行がないことを私たちは知っています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'
于 2012-07-18T15:26:39.390 に答える