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

來源:互聯網
上載者:User
通過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要求的資料行。

    項目中很多業務對象的資料表中都具有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要求的資料行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.