让mysql忽略where条件

时间:2011-12-25 18:56:03

标签: mysql

如果没有设置变量,是否会使mysql忽略条件,例如

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

如果设置了$ baz,则运行查询正常,否则运行查询减去AND子句?

由于

5 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

我认为这些是PHP变量?

答案 2 :(得分:1)

只需创建一个变量$ ignoreWhere并将其写为:

SELECT * FROM foo WHERE $ ignoreWhere = 1 OR id = $ id

将其设置为1以忽略语句的其余部分。

答案 3 :(得分: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,则绕过所有其他条件

答案 4 :(得分:0)

感谢Tim Medora。您的解决方案有效 起初我不清楚,但是当我使用它时起作用。 所以这是故事 如果您使用以下内容,则当$ y为空时,它就像滑动AND部分一样。

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

如果$ y为null,则表示它是

AND( TRUE or y=$y)  

表示

AND TRUE

所以这意味着AND部分对WHERE子句的其余部分没有影响。换句话说,它被跳过了。