在作項目中,咱們常常遇到複雜的查詢方法,要根據用戶的輸入,判斷某個參數是否合法,合法的話才能看成過濾條件,咱們一般的作法是把查詢SQL賦值給一個字符串變量,而後根據判斷條件動態的拼接where條件進行查詢。下面來簡單說一下寫SQL中遇到的問題和解決辦法。sql
好比,有個公司要作一個系統,要支持多語言,這個時候咱們就要將語音信息存儲在數據庫中。而後,根據客戶選擇查詢對應的語言字段,進行顯示。下面咱們來模擬這個場景,打開SQL Server,新建SysLanguage表,添加一些語言字段,如English,Chinese,French,這裏French不知道是什麼,就都設置爲Empty。數據庫
建表的SQL和插入一些簡單的數據,SQL以下:網絡
CREATE TABLE SysLanguage( Id INT PRIMARY KEY, English NVARCHAR(100), Chinese NVARCHAR(100), French NVARCHAR(100) ) INSERT INTO SysLanguage VALUES (1, 'Hello', '你好', 'Empty') INSERT INTO SysLanguage VALUES (2, 'world', '世界', 'Empty') INSERT INTO SysLanguage VALUES (3, 'Book', '書', 'Empty') INSERT INTO SysLanguage VALUES (4, 'Open', '打開', 'Empty') INSERT INTO SysLanguage VALUES (5, 'Save', '保存', 'Empty') INSERT INTO SysLanguage VALUES (6, 'New', '新建', 'Empty')
那麼,考慮到系統性能,咱們可能會使用存儲過程,來減小網絡通訊量和提升響應速度。那麼,在存儲過程當中,咱們會傳入一個參數,而後根據參數來查詢指定的語言字段,那麼SQL該怎麼寫呢?函數
這個時候,咱們會想到在C#代碼中,咱們都是把SQL拼好,而後傳給SQL Server執行,咱們能夠拼接字符串啊,而後有了下面的寫法:性能
DECLARE @sql NVARCHAR(100); DECLARE @para NVARCHAR(20); SET @para = 'Chinese'; SET @sql = 'select ID, ' + @para + ' from SysLanguage' print @sql exec(@sql)
固然這樣寫沒有任何問題,可是當SQL很複雜的時候,不少的引號和字符轉義,還有拼接字符串帶來的缺乏空格的問題,會使人崩潰!下面來講一種不拼接字符串的寫法,代碼以下:測試
DECLARE @para NVARCHAR(20); SET @para = 'Chinese'; SELECT ID, CASE @para WHEN 'English' THEN English WHEN 'Chinese' THEN Chinese ELSE French END AS [Language] FROM SysLanguage
這裏使用了CASE WHEN語句來進行判斷,當判斷條件太多時,寫起來也很累,咱們能夠寫一個Function來進行封裝,固然,具體用那種方法,要看具體狀況了。編碼
這裏說道了CASE WHEN,就不得不提另一種查詢了。先來看下需求:從學生表中查詢出男生的人數,女生的人數和學生總人數。spa
看到這個,咱們首先想到了SUM函數,可是,而後呢?好像哪裏不對?那麼,到底該怎麼寫呢,固然仍是用CASE WHEN,來看下代碼吧code
SELECT SUM(CASE StuSex WHEN 1 THEN 1 ELSE 0 END) AS Boys, SUM(CASE StuSex WHEN 1 THEN 0 ELSE 1 END) AS Girls, SUM(StuID) AS Total FROM Student
看到代碼,感受是否是很簡單啊,就是當時沒想到,呵呵!blog
習慣了C#代碼,忽然寫起SQL來,感受仍是有點那麼不順手!下面來看看,當有多個查詢條件,可是又不肯定幾個查詢條件時,SQL該怎麼寫?咱們常常遇到這種需求,頁面上不少控件,要根據用戶的輸入進行查詢,這個時候咱們就要判斷傳入的控件的值是否符合指定條件,符合條件了才能被做爲查詢條件,不然就忽略這個條件。
拼接字符串的寫法相信你們都常常用,這裏就不寫了,咱們之接來看布拼接SQL怎麼查詢!
好比如今要查詢指定條件的學生,用戶可能查詢全部,或查詢男生,或查詢指定Id的學生,或……等待,可能不少種狀況。下面咱們來寫布拼接字符串的SQL,代碼以下:
DECLARE @ID INT; DECLARE @Sex BIT; DECLARE @Name NVARCHAR(50); SET @ID = -1; SET @Sex = NULL; SET @Name = 'Ja'; SELECT * FROM Student WHERE (@ID = -1 OR StuID = @ID) AND (@Sex IS NULL OR StuSex = @Sex) AND (@Name IS NULL OR StuName LIKE '%' + @Name + '%')
這裏聲明三個變量,當作傳入的參數,傳入的參數都有默認值,或者爲NULL,咱們在where添加里面用了OR添加判斷,首先判斷@ID = -1,若是條件成立了,OR就不會再判斷OR後面的條件,到這裏就(@ID = -1 OR StuID = @ID)就返回一個TRUE,至關於WHERE TRUE AND ……,因此就會忽略這個查詢條件繼續走下面的過濾判斷。這樣寫,比拼接字符串好的多吧!
最後來講一下數據庫中N字符的做用,說白了就是將後面的字符串內容,轉換成Unicode編碼,來寫段SQL測試一下吧
DECLARE @a NVARCHAR(20) DECLARE @b NVARCHAR(20) SET @a = N'中文' SET @b = '中文' IF(@a = @b) PRINT '數值相等' ELSE PRINT '不相等'
輸出結果以下:
在中文版的系統中,是相等的,在英文版的系統中,@b會顯示亂碼。你們能夠測試一下!
做者:雲霏霏
博客地址:http://www.cnblogs.com/yunfeifei/
聲明:本博客原創文字只表明本人工做中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關係。非商業,未受權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。