2011-12-25 15 views
2

変数が設定されていない場合、mysqlは条件を無視するようにしますか?mysqlが条件を無視するようにする

SELECT * 
FROM foo 
WHERE id = $id 
AND bar = $baz 

$ bazが通常どおり実行されるように設定されている場合は、AND句を除いたクエリを実行しますか?

おかげ

答えて

6
SELECT * 
FROM foo 
WHERE id = $id 
AND (bar = $baz OR $baz [equals null, empty string, zero, whatever]) 

MySQLは、これまでその実行計画でshort circuit evaluationを使用している場合、私は知りませんが、次のように、最初の安価な比較を置くことが有益であるかもしれない:

SELECT * 
FROM foo 
WHERE id = $id 
AND ($baz [equals null, empty string, zero, whatever] OR bar = $baz) 

することができます複数のパラメータでこの方法を使用します。

SELECT * 
FROM foo 
WHERE id = $id 
AND ($baz [equals null, empty string, zero, whatever] OR bar = $baz) 
AND ($x = 0 or x = $x) 
AND ($y IS NULL OR y = $y) 

-- etc. 
+0

ありがとう助け:) – Bob

1

ただ、変数$ ignoreWhereを作るとしてそれを書く:の残りの部分を無視するように1に設定しFOO $ ignoreWhere = 1またはID = $ IDから

SELECT *

をステートメント。

+0

私は最初のところで質問を理解した方法ですが、彼はバーを持っていると思います...無視、id = – Nicolas78

0

はい。あなたはこのように、実際にあなたの変数の条件である条件を追加:

SELECT * 
FROM foo 
WHERE $baz is not null -- this condition tests if $baz is set 
AND (
    ... -- all "normal" conditions, including any involving $baz 
) 

$bazが設定されていない場合は、他のすべての条件が

+0

と$ bazがnullの場合はどうなりますか? –

+0

@SergeiTulentsev '$ baz 'が' null'であることは不可能です。それが 'null'だった場合、OPの条件' AND bar = $ baz'は真ではありません( 'null'はSQLと同じではないとみなされません)。彼が 'ヌル 'をテストしたいのであれば、' AND bar IS NULL'という構文が必要で、別のクエリが必要です。 – Bohemian

+0

私はあなたがその質問を誤解していると思います。受け入れられた答えをご覧ください。 –

2
$q = "SELECT ... id=$id " 
if ($baz) 
    $q .= " AND bar = $baz"; 

をバイパスしている私は、これらはPHP変数であると仮定しますか?

0

Tim Medoraに感謝します。ソリューションが機能しました。 最初は明確ではありませんでしたが、私が使用したときは効果がありました。 これは物語です 以下を使用すると、$ yがNullのときにANDセクションをスキップするような動作になります。

AND ($y IS NULL OR y = $y) 

$ yがnullの場合、それはそれはだから、これはAND節がWHERE句の残りの部分には影響を与えないことを意味

AND TRUE 

を意味

AND(TRUE or y=$y) 

であることを意味します。つまり、スキップされます。

関連する問題