2013-03-15 59 views
-5

我在我的應用程序中有一個搜索字段,而且我正在使用SQL。在sql中使用'if'

我的應用程序有3個獨立的ComboBox ES,允許用戶選擇他/她想要搜索的內容。

例如,我們有Name,在搜索領域family nameage,我想選擇與age 20或人的人age 20 and named "john" or other states

因此,我應該使用IFELSE,WHERE的一般程序來支持所有這些狀態嗎?

+2

你知道[SQL Books Online](http://msdn.microsoft.com/en-us/library/bb510741.aspx)嗎? – 2013-03-15 09:48:10

+0

你自己說過,只是改變一下英語的語法:「年齡= 20或(年齡= 20,姓名='約翰')」。從邏輯上講,這與「age = 20 or name ='John'相同。 – Polyfun 2013-03-15 09:48:31

+0

select * from yourTable其中Name = @ Name and Family = @ Family and Age = @ Age,並傳遞ComboBoxes中的值。 ? – Alex 2013-03-15 09:49:16

回答

1

假設變量@Age@Name@FamilyName

SELECT * 
FROM tbl 
WHERE 
    (@Age IS NULL OR Age == @Age) 
    AND (@Name IS NULL OR Name LIKE '%' + @Name + '%') 
    AND (@FamilyName IS NULL OR FamilyName LIKE '%' + @FamilyName+ '%') 

沒有必要,如果做一個。但是,如果你想做一個IF中的SQL這是CASE WHEN <true state> THEN <true action> ELSE <false action> END

+0

這不會工作。如果用戶不想過濾三個選項中的任何一個? – CathalMF 2013-03-15 10:06:43

+0

現在我看到沒有必要做一個IF TnX – 2013-03-15 10:31:23

+0

@CathalMF,那麼所有這三個變量都將被忽略,所有這三個變量都將爲NULL,這將滿足所有三個OR語句的前半部分,因此不需要進行過濾 – 2013-03-15 10:38:44

0

語法在SQL的if-else是

IF yourconditon 
BEGIN 
    //sql query 
END 
ELSE 
    BEGIN 
    //sqlquery 
    End 
+0

這有什麼用? – Alex 2013-03-15 09:50:12

0

如何在數據庫中執行SQL? 它是數據庫中的存儲過程,還是隻是將sql語句發送到數據庫?

如果是第二次,只是做的if-then-else的東西,在你的C#代碼和發送不同的SQL語句到數據庫。

+0

是的,這是一個存儲過程 – 2013-03-15 10:32:37

-1

你應該做的是根據用戶選擇的內容在你的windows項目中創建SQL。

StringBuilder mySQL = new StringBuilder(); 

if(Name != "") 
    mySQL.Append("Name like '%" + Name + "'%"); 

if(mySQL != "" && (familyName != "" || age != "")) 
    mySQL.Append(" AND"); 

if(familyName != "") 
    mySQL.Append(" familyName like '%" + familyName + "%'); 

並繼續與您的其餘條件。 將stringbuilder字符串追加到SELECT查詢中。

string finalSQL = "SELECT * FROM MyTable WHERE " + mySQL.toString(); 
+1

有好的SQL注入漏洞 – 2013-03-15 09:54:37

+0

那麼他仍然需要驗證用戶輸入什麼來防止這種情況,但這不是問題! – CathalMF 2013-03-15 09:57:04

+0

不,你不通過驗證輸入來修復注入;你通過使用參數修復注入 - 這顯然不是***這裏顯示的內容。上面顯示的代碼***非常危險***,應該強烈不鼓勵。如果你的代碼「驗證用戶輸入的內容」然後使用串聯,那麼你的代碼就會被打破。 – 2013-03-15 09:58:14

0

你有幾個不同的選擇,並會建議性能測試(一如既往)。

  1. 動態SQL。

生成SQL動態基於所使用的,所以參數;

declare sqlTxt VARCHAR(max) 
delcare params VARCHAR(128) 

params = 'Age INT, Name VARCHAR(128), FamilyName VARCHAR(128)' 
sqlText = 'SELECT field Name From Table WHERE 1=1' 

IF (IS NOT NULL) sqlText += 'AND Age == @Age ' 
IF (IS NOT NULL) sqlText += 'AND Name LIKE %@Name%' 
IF (IS NOT NULL) sqlText += 'AND FamilyName LIKE %FamilyName%' 

EXEC sp_executesql @sqlText, @params, @Age = @Age, @Name = @Name, @FamilyName = @FamilyName 
  1. 手柄SQL

使用張貼禮Gassert的解決方案。

一般來說,較小的查詢,你應該罰款使用選項2,但如果你擴大搜索範圍,包括許多不同的參數做到心中有數「參數嗅探」,這可能會減慢你的速度。

如果性能是一個問題,基本測試兩種方式。

+0

目前還不清楚這裏的文字在哪裏開始和結束;這很重要,因爲你可能會創建一個SQL注入漏洞,或者你可能會在文本中包含參數名並使用sq_executesql(這很好) – 2013-03-15 09:57:00