程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> 通過SQL Server的位運算功能巧妙解決多選查詢方法

通過SQL Server的位運算功能巧妙解決多選查詢方法

編輯:更多數據庫知識

無論使用int還是varchar,對於Status的多選查詢都是不易應對的。舉例,常規思維下對CustomerStatus的Enum設置如下:
復制代碼 代碼如下:
[Serializable]
public enum CustomerStatus
{
New = 0,
Active = 1,
Overdue = 2,
Suspended = 3,
Closing = 4,
Closed = 5
}

在數據庫中以int形式存儲了Status值。
如果我在頁面中想一次搜索狀態為Active,Overdue和Suspended狀態的Customer,該怎麼辦?程序是不是得把這三個狀態值
拼成字符串傳遞給SQL去處理?雖然能實現,但是相當低效。

現在給出一個標准解決方案:
(1). 所有可能被用作搜索條件的枚舉都應按如下位運算方式定義。
復制代碼 代碼如下:
public enum CustomerStatus
{
New = 1,
Active = 1<<1,
Overdue = 1<<2,
Suspended = 1<<3,
Closing = 1<<4,
Closed = 1<<5
}

(2). 在數據庫設計時,Status的字段必須為int型。
這樣當我們做多選查詢時@Status的Value= CustomerStatus.Active | CustomerStatus. Overdue| CustomerStatus. Suspended

(3). 查詢語句如下:
復制代碼 代碼如下:
Select *
From Customer
Where [Status] & @Status = [Status]

如果@Status可為null時,
復制代碼 代碼如下:
Select *
From Customer
Where ( @Status is null Or [Status] & @Status = [Status])

用這樣一條簡單的語句,就可以獲取到所有符合@Status要求的數據行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved