2011-05-26 50 views
4

在簡單的SQL書,還有的代碼提,如果我用where 1 = 0,我可以放心地添加一個或條件類似部分:Mysql的其中1 = 0混亂

WHERE 
    1=0 
    OR name LIKE '%Toledo%' 
    OR billaddr LIKE '%Toledo%' 
    OR shipaddr LIKE '%Toledo%' 

我沒有得到它,爲什麼當我使用where 1 = 0我可以安全地添加OR語句

我可以只使用類似下面的內容嗎?

WHERE 
    1=1 
    OR name LIKE '%Toledo%' 
    OR billaddr LIKE '%Toledo%' 
    OR shipaddr LIKE '%Toledo%' 

據我所知,where 1=1是添加And語句的快捷方式。
據我所知,因爲where 1 =1將返回true.Can我可以使用它的Or聲明嗎?
Istill沒有得到的部分where 1 = 0
任何解釋將是偉大的。

+0

請注意,爲便於閱讀,您也可以只用'那裏虛假或'&'其中true和'。 – Fx32 2017-03-22 10:57:31

回答

4

這取決於您正在處理的布爾操作的類型。如果要添加可變數量的AND語句,則使用總是計算爲真的語句,如1 = 1。另一方面,如果您想要對OR語句執行相同的操作,則應該使用計算結果爲false的語句,如1 = 0

假設你有一個布爾變量x有一個不確定的真值(這可能是真的,也可能是假的。你不知道。)現在,如果你發現x AND false的價值,你會得到false,不管x的值是多少。

在另一方面,如果你看看x OR true,你會得到true。再次,這與x的真值無關。

在您的聲明中,您希望硬編碼值對查詢的邏輯沒有影響。由於false OR a OR b OR c在邏輯上等於a OR b OR c,硬編碼語句不起作用。在另一種情況下,true AND a AND b AND c相當於a AND b AND c

+0

thx you so much – slier 2011-05-27 14:52:07

1

MySQL使用short-circuit boolean evaluation.

只要結果解析到一個明確的TRUE或FALSE的MySQL停止評估行的其餘部分。

TRUE OR ? OR ?將始終爲TRUE,因此MySQL只會查看第一個項目,而不會測試其他任何項目。
FALSE AND ? AND ?將始終是FALSE,所以MySQL不會再看其他測試。

這有(意外)副作用,即MySQL會從來不看與喜歡你的表,而是在下面的查詢返回的所有行:

SELECT * FROM atable 
WHERE 
    1=1       /* <--- this makes the whole OR set always true*/ 
    OR name LIKE '%Toledo%'  /* therefore the like tests are never done  */ 
    OR billaddr LIKE '%Toledo%' /*and all rows are returned */ 
    OR shipaddr LIKE '%Toledo%' 

在此查詢:

SELECT * FROM atable 
WHERE 
    1=0       /* false OR ? has an unknown outcome so */ 
    OR name LIKE '%Toledo%'  /* MySQL has to evaluate the LIKE tests */ 
    OR billaddr LIKE '%Toledo%' /*only some rows will be returned*/ 
    OR shipaddr LIKE '%Toledo%' 

這個工程正好符合AND

+0

thx for urx explaination ..絕對幫助 – slier 2011-05-27 14:51:56

0

相反我可以只使用類似下面?

WHERE 
    1=1 
    OR name LIKE '%Toledo%' 
    OR billaddr LIKE '%Toledo%' 
    OR shipaddr LIKE '%Toledo%' 

,將返回每一行(因爲它總是如此),所以沒有...