2010-12-17 69 views

回答

6

唯一可能的用途是防止查詢返回任何行。我偶爾做過測試「沒有找到結果」的類型邏輯。

15
在SQL Server

,您可以快速創建一個表的副本沒有這樣

select * into Newtable 
from Oldtable 
where 1 = 0 

任何數據,這將創建一個新表具有相同的結構與舊錶

另一種選擇是返回一個空結果集

+0

更簡單,效果相同: 'select * into Oldtable from Oldtable where 0' – Jpsy 2012-10-26 10:27:03

3

我已經看到一些實用程序使用該語法來收集有關表的元數據。他們可以運行諸如select * from sometable where 1=0之類的查詢以「高效」地從表中獲取列而不用任何數據。

+0

不適用於MySQL,我認爲。這就是'SHOW COLUMNS'的用途。 – ceejayoz 2010-12-18 17:12:54

+0

@ceejayoz:謝謝你的信息。我不知道關於MySQL;我假設(顯然不正確)它會返回一個空的結果集,它仍然會有列。它在其他SQL實現中起作用(至少有一些)。 – 2010-12-18 22:20:15

-1

我在基於複選框值列表生成SQL時在代碼中使用了這個。例如,如果我允許用​​戶從水果中進行選擇:

蘋果 橙子 梨

...他們選擇蘋果和橘子,我的僞代碼如下所示:

string sqlWhere = "select * from fruit where 1 = 0" 
if (FruitList.Any()) { 
    sqlWhere += " or code in (" 
    foreach (Fruit in FruitList) 
     sqlWhere += string.Format("'{0}',"); 
    /*Add the close parens*/ 
    sqlWhere = sqlWhere.Substring(0,sqlWhere.Length-2) + ")"; 
} 

這將只返回用戶選擇的值。如果他們不選擇任何水果,則不會返回任何結果。

*請注意此代碼並未考慮SQL注入。爲什麼您可能會看到

where 1 = 0 
+0

我認爲你的AND需要成爲一個OR。 – ceejayoz 2010-12-18 17:12:19

+0

你說得對。更新。 – 2011-01-03 20:25:36

0

你可以使用這樣的查詢作爲一個「平」來檢查,如果你的數據庫連接仍然是開放的,並且數據庫是健康等只是一個例子 - 如果你沒有結果,但是,如果你遇到某種錯誤,就會出現問題。你會針對某種系統表編寫查詢。根據你的數據庫,你可能會做一些簡單的事情 - 在PostgreSQL中,你可以說select 1;,在Oracle中,我見過select 1 from dual;。如果你的數據庫沒有能力處理選擇中的自由浮動表達式,並且沒有雙重對等表達式,那麼你可以執行一些類似於select * from sometable where 0 = 1;的操作。

相關問題