2010-03-15 170 views
2

假設我們需要檢查三個布爾條件來執行選擇查詢。讓三個標誌爲'A','B'和'C'。使用sql構建動態In語句

如果所有三個標誌都設置爲'1',那麼要生成的查詢是 SELECT * FROM Food WHERE Name In('Apple,'Biscuit','Chocolate'); 如果只將標誌'A'和'B'設置爲'1'且C設置爲'0'。然後生成以下查詢。

SELECT * 
    FROM Food 
WHERE Name In ('Apple, 'Biscuit'); 

這樣做的最佳方法是什麼?

+0

是怎麼想的計算機編程語言構建這個動態SQL的?任何特定的? – 2010-03-15 15:42:56

+0

要使用的SQL方言是T-SQL。 – TrustyCoder 2010-03-15 15:48:01

+1

T-SQL的意思是Sybase和/或SQL Server – 2010-03-15 15:55:01

回答

2
SELECT * 
    FROM Food 
WHERE (Name = 'Apple' AND <condition A>) 
    OR (Name = 'Biscuit' AND <condition B>) 
    OR (Name = 'Chocolate' AND <condition C>) 

現在,雖然是正確這不是從性能的角度來看可取的,因爲條件A,B,和C是不被驅動的數據(它們不DON從行改變到行)。因此,您可以通過動態構建SQL來使用所有可能條件的排列 - 使用IN子句並動態構建其字符串。

另一種解決方案是組裝最終導致客戶端運行每個單獨SELECT(僞代碼):

if A then { 
    result1 = execute("SELECT * FROM Food WHERE Name = 'Apple') 
} 
if B then { 
    result2 = execute("SELECT * FROM Food WHERE Name = 'Biscuit') 
} 
if C then { 
    result2 = execute("SELECT * FROM Food WHERE Name = 'Chocolate') 
} 

result = join(result1, result2, result3) 

該解決方案可以正常工作,當你有一個或兩個真實情況的案件比例很高。

+0

我喜歡第一個解決方案,第二個解決方案需要更多的開銷。 – TrustyCoder 2010-03-17 04:36:24

0

首先,您可能需要檢查是否全部爲假並顯示錯誤。或者,如果您的情況可以接受,可能不會。

然後,如果這些標誌僅僅是布爾變量DO(僞)

sql = "SELECT * 
    FROM Food 
WHERE Name In ("; 
if (A) sql += "'Apple', " 
if (B) sql += "'Biscuit', " 
if (C) sql += "'Chocolate', " 
sql = sql.deleteLastCharacter() + ");"; 
0

你爲什麼不包括在查詢A/B/C? select * from food where(name ='Apple'or NOT A)and(name ='Biscuit'or NOT B)...