通過SQL Server的位運算功能巧妙解決多選查詢方法
更新時間:2012年01月09日 20:45:08 作者:
項目中很多業(yè)務對象的數(shù)據(jù)表中都具有Status字段,有人使用int型保存Status,有人使用varchar型
無論使用int還是varchar,對于Status的多選查詢都是不易應對的。舉例,常規(guī)思維下對CustomerStatus的Enum設置如下:
[Serializable]
public enum CustomerStatus
{
New = 0,
Active = 1,
Overdue = 2,
Suspended = 3,
Closing = 4,
Closed = 5
}
在數(shù)據(jù)庫中以int形式存儲了Status值。
如果我在頁面中想一次搜索狀態(tài)為Active,Overdue和Suspended狀態(tài)的Customer,該怎么辦?程序是不是得把這三個狀態(tài)值
拼成字符串傳遞給SQL去處理?雖然能實現(xiàn),但是相當?shù)托А?
現(xiàn)在給出一個標準解決方案:
(1). 所有可能被用作搜索條件的枚舉都應按如下位運算方式定義。
public enum CustomerStatus
{
New = 1,
Active = 1<<1,
Overdue = 1<<2,
Suspended = 1<<3,
Closing = 1<<4,
Closed = 1<<5
}
(2). 在數(shù)據(jù)庫設計時,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要求的數(shù)據(jù)行。
復制代碼 代碼如下:
[Serializable]
public enum CustomerStatus
{
New = 0,
Active = 1,
Overdue = 2,
Suspended = 3,
Closing = 4,
Closed = 5
}
在數(shù)據(jù)庫中以int形式存儲了Status值。
如果我在頁面中想一次搜索狀態(tài)為Active,Overdue和Suspended狀態(tài)的Customer,該怎么辦?程序是不是得把這三個狀態(tài)值
拼成字符串傳遞給SQL去處理?雖然能實現(xiàn),但是相當?shù)托А?
現(xiàn)在給出一個標準解決方案:
(1). 所有可能被用作搜索條件的枚舉都應按如下位運算方式定義。
復制代碼 代碼如下:
public enum CustomerStatus
{
New = 1,
Active = 1<<1,
Overdue = 1<<2,
Suspended = 1<<3,
Closing = 1<<4,
Closed = 1<<5
}
(2). 在數(shù)據(jù)庫設計時,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要求的數(shù)據(jù)行。
相關文章
SQL Server提示"選定的用戶擁有對象,所以無法除去該用戶”
今天在幫朋友弄一臺服務器的時候當我需要刪除一個數(shù)據(jù)庫里的用戶時,提示如下錯誤信息: "選定的用戶擁有對象,所以無法除去該用戶" 如何解決呢?2009-04-04
Sql Server 索引使用情況及優(yōu)化的相關Sql語句分享
Sql Server 索引使用情況及優(yōu)化的相關 Sql 語句,非常好的SQL語句,記錄于此,需要的朋友可以參考下2012-05-05
SQL Server Bulk Insert 只需要部分字段時的方法
上午在找Bulk Insert的資料看,還轉了一篇。不巧今天下午就用上了,我遇到的需求是導出表A中的N個字段,然后導入到表B的N個字段當中。2011-10-10
sql server編寫通用腳本實現(xiàn)獲取一年前日期的方法
這篇文章主要介紹了sql server編寫通用腳本實現(xiàn)獲取一年前日期,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Spark SQL 中對 Map 類型的操作函數(shù)示例詳解
這篇文章主要介紹了SparkSQL中對Map類型的操作函數(shù),包括創(chuàng)建、訪問、修改、合并、鍵值操作等功能,通過這些函數(shù),可以方便地進行復雜鍵值對數(shù)據(jù)的處理,感興趣的朋友跟隨小編一起看看吧2025-01-01
Sql Server 創(chuàng)建數(shù)據(jù)庫腳本Create DATABASE
這篇文章主要介紹了Sql Server 創(chuàng)建數(shù)據(jù)庫腳本語句Create DATABASE的使用,需要的朋友可以參考下2014-08-08

