2012年1月31日 星期二

SQL 一秒看破 T - SQL 動態條件查詢

相信很多人有這種經驗

一個複雜的查詢 讓使用者很彈性 讓程式設計師很痛苦

你想要給人查 1.商品符合關鍵字 2.價錢介於範圍值 3.產品種類的限制 4.人氣 5.庫存 ... 等條件

簡單,你爺爺我會 T - SQL,就一項條件寫一個 Where ... and ... and ... and ... and ... and ...

判斷的方式用 C嚇 IF ELSE 就搞定了呀

code大概會長這樣

但是芳芳說:自己codeing寫一堆,麻煩做,聰明小孩就交給微軟 xxxTableAdapter 兩行就搞定了

既是強型別,又能直接造方法

但是查詢方法一種要造一個方法來查

 

 

 

 

以下正題。

其實沒那麼恐怖,T - SQL就能搞定,只要寫一個方法

 

 

 

 

先實驗T - SQL



DECLARE @uid int, @rank_id int, @bonus int, @bonusMoreThen int
DECLARE @account nchar(20), @password nchar(20)
DECLARE @email nchar(50), @name nvarchar(50), @nickname nvarchar(50), @phone nvarchar(50), @residence nvarchar(50)
DECLARE @date datetime, @birthday date
DECLARE @gender bit, @employee bit

set @uid = null
set @rank_id = null
set @bonus = null --123
set @bonusMoreThen = null --500

set @account = null
set @password = null

set @email = null
set @name = null
set @nickname = null
set @phone = null
set @residence = null

set @date = null
set @birthday = null

set @gender = null
set @employee = null

select * from account 
where rank_id = IsNull(@rank_id,rank_id)
and bonus = IsNull(@bonus,bonus)
and bonus > IsNull(@bonusMoreThen,1)

and account = IsNull(@account,account)
and password = IsNull(@password,password)

and email = IsNull(@email,email)
and name = IsNull(@name,name)
and nickname = IsNull(@nickname,nickname)
and phone = IsNull(@phone,phone)
and residence = IsNull(@residence,residence)

and date = IsNull(@date,date)
and birthday = IsNull(@birthday,birthday)

and gender = IsNull(@gender,gender)
and employee = IsNull(@employee,employee)


前大半是宣告參數不用管,後面是把14個條件都寫出來

最神奇的是使用了 IsNull()函數

IsNull()函數 接受2個參數,當第一個參數不為Null時 使用第一個參數,當第一個參數為Null時 使用第二個參數

參數不為Null就像是使用者選定了條件來查詢,所以 Where 欄位 = 參數 來查詢特定條件

參數為Null就像是使用者沒給條件就查詢,所以 Where 欄位 = 欄位

這是什麼意思呢,舉例來說就像是 Where 1 = 1 等於這個條件恆為真,所以會查到所有的資料

也可以理解成 Where 欄位 = 任意值 (因為 目前查詢到的值 等於 目前查詢到的值 ex:Where account = account)

因為預設沒設定參數就是不管這行條件,所以讓這行恆為真,再加上所有條件是以AND串連,就等於不管這行條件的意思

 

 

 

 

然後是TableAdapter查詢組態精靈裡面的語法

不用管變數宣告了 微軟幫你搞定了 真那麼好奇可以移至定義 (人生在世不需要什麼都知道)

 

 

 

 

好啦,大成功

以上

1 則留言: