我在我的應用程序中有一個搜索字段,而且我正在使用SQL。在sql中使用'if'
我的應用程序有3個獨立的ComboBox
ES,允許用戶選擇他/她想要搜索的內容。
例如,我們有Name
,在搜索領域family name
和age
,我想選擇與age 20
或人的人age 20 and named "john" or other states
。
因此,我應該使用IF
,ELSE
,WHERE
的一般程序來支持所有這些狀態嗎?
我在我的應用程序中有一個搜索字段,而且我正在使用SQL。在sql中使用'if'
我的應用程序有3個獨立的ComboBox
ES,允許用戶選擇他/她想要搜索的內容。
例如,我們有Name
,在搜索領域family name
和age
,我想選擇與age 20
或人的人age 20 and named "john" or other states
。
因此,我應該使用IF
,ELSE
,WHERE
的一般程序來支持所有這些狀態嗎?
假設變量@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
這不會工作。如果用戶不想過濾三個選項中的任何一個? – CathalMF 2013-03-15 10:06:43
現在我看到沒有必要做一個IF TnX – 2013-03-15 10:31:23
@CathalMF,那麼所有這三個變量都將被忽略,所有這三個變量都將爲NULL,這將滿足所有三個OR語句的前半部分,因此不需要進行過濾 – 2013-03-15 10:38:44
語法在SQL的if-else是
IF yourconditon
BEGIN
//sql query
END
ELSE
BEGIN
//sqlquery
End
這有什麼用? – Alex 2013-03-15 09:50:12
如何在數據庫中執行SQL? 它是數據庫中的存儲過程,還是隻是將sql語句發送到數據庫?
如果是第二次,只是做的if-then-else的東西,在你的C#代碼和發送不同的SQL語句到數據庫。
是的,這是一個存儲過程 – 2013-03-15 10:32:37
你應該做的是根據用戶選擇的內容在你的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();
有好的SQL注入漏洞 – 2013-03-15 09:54:37
那麼他仍然需要驗證用戶輸入什麼來防止這種情況,但這不是問題! – CathalMF 2013-03-15 09:57:04
不,你不通過驗證輸入來修復注入;你通過使用參數修復注入 - 這顯然不是***這裏顯示的內容。上面顯示的代碼***非常危險***,應該強烈不鼓勵。如果你的代碼「驗證用戶輸入的內容」然後使用串聯,那麼你的代碼就會被打破。 – 2013-03-15 09:58:14
你有幾個不同的選擇,並會建議性能測試(一如既往)。
生成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
使用張貼禮Gassert的解決方案。
一般來說,較小的查詢,你應該罰款使用選項2,但如果你擴大搜索範圍,包括許多不同的參數做到心中有數「參數嗅探」,這可能會減慢你的速度。
如果性能是一個問題,基本測試兩種方式。
目前還不清楚這裏的文字在哪裏開始和結束;這很重要,因爲你可能會創建一個SQL注入漏洞,或者你可能會在文本中包含參數名並使用sq_executesql(這很好) – 2013-03-15 09:57:00
你知道[SQL Books Online](http://msdn.microsoft.com/en-us/library/bb510741.aspx)嗎? – 2013-03-15 09:48:10
你自己說過,只是改變一下英語的語法:「年齡= 20或(年齡= 20,姓名='約翰')」。從邏輯上講,這與「age = 20 or name ='John'相同。 – Polyfun 2013-03-15 09:48:31
select * from yourTable其中Name = @ Name and Family = @ Family and Age = @ Age,並傳遞ComboBoxes中的值。 ? – Alex 2013-03-15 09:49:16