2011-12-25 102 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子句的其餘部分沒有影響。換句話說,它被跳過了。