2011-12-25 127 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 2011-12-25 21:06:59

1

只是做一个变量$ ignoreWhere并把它写为:

SELECT * FROM foo其中$ ignoreWhere = 1或ID = $ ID

将其设置为1忽略的休息声明。

+0

这就是我首先了解这个问题,但我想他想和AND栏被忽略,而不是id = – Nicolas78 2011-12-25 19:02:46

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 IS为null? – 2011-12-25 19:02:45

+0

@SergeiTulentsev'$ baz'不可能是'null'。如果它是'null',那么OP的条件'AND bar = $ baz'不会**为真(SQL不认为'null'等同于'null')。如果他想测试'null',他需要语法'AND bar IS NULL',它需要一个不同的查询。 – Bohemian 2011-12-26 08:22:24

+0

我想你误解了这个问题。看到接受的答案。 – 2011-12-26 08:54:56

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

我认为这些都是PHP变量?

0

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

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

如果$ y为null,则意味着它是

AND(TRUE or y=$y) 

这意味着

AND TRUE 

因此,这意味着和第对WHERE子句的其余部分没有影响。换句话说,它被跳过了。