一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 通過SQL Server的位運算功能巧妙解決多選查詢方法

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

2019-12-13 11:32MSSQL教程網 Sql Server

項目中很多業務對象的數據表中都具有Status字段,有人使用int型保存Status,有人使用varchar型

無論使用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要求的數據行。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 被老头肉至怀孕小说 | 暖暖在线精品日本中文 | 奇米9999| 日本偷偷操| 青青久久精品国产免费看 | 精品久久久久久久久久久 | 国内自拍网红在线综合 | 国产3344视频在线观看免费 | 亚洲欧美日韩另类精品一区二区三区 | 午夜欧美福利视频 | 果冻传媒i91media免费 | 扒开女人下面使劲桶屁股动漫 | 免费观看美女被cao视频 | tube性睡觉hd | 视频一区二区国产无限在线观看 | 亚洲AV国产福利精品在现观看 | 日本无遮挡拍拍拍凤凰 | 青草青草视频2免费观看 | 俄罗斯伦理片 | 9总探花新品牛仔背带裤 | 亚洲色图影院 | 国产国语videosex另类 | 日韩网新片免费 | 成人在线播放视频 | 91精品综合 | 超爽人人做人人爽 | 亚洲精品国产乱码AV在线观看 | 操碰97| 国产日韩一区二区三区 | 成人免费视频一区 | 免费一区二区视频 | 513热点网深夜影院影院诶 | 精品日韩欧美一区二区三区 | 俄罗斯极品h在线 | 国产黄频 | 国产农村一级特黄α真人毛片 | 午夜一级免费视频 | 四虎国产精品免费入口 | 四虎最新永久在线精品免费 | 国内揄拍国内精品久久 | jizz漫画 |