zoukankan      html  css  js  c++  java
  • 通过SQL Server的位运算功能巧妙解决多选查询

    通过SQL Server的位运算功能巧妙解决多选查询

        项目中很多业务对象的数据表中都具有Status字段,有人使用int型保存Status,有人使用varchar型。

    无论使用int还是varchar,对于Status的多选查询都是不易应对的。举例,常规思维下对CustomerStatusEnum设置如下:

        [Serializable]

           public enum CustomerStatus

           {

            New = 0,

            Active = 1,

            Overdue = 2,

            Suspended = 3,

            Closing = 4,

            Closed = 5

    }

    在数据库中以int形式存储了Status值。

    如果我在页面中想一次搜索状态为ActiveOverdueSuspended状态的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型。

            这样当我们做多选查询时@StatusValue= 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要求的数据行。

  • 相关阅读:
    C++
    C语言获取系统时间的几种方式
    我在学习编程中犯的两个最大错误
    《十天学会单片机和C语言编程》
    socket 编程通信实例
    比尔·盖茨给年轻人的十一个忠告 句句是哲理
    程序员有八个级别。
    DOS debug 命令的详细用法
    从命令行模式运行Windows管理工具。
    无法删除DLL文件解决方法(转)
  • 原文地址:https://www.cnblogs.com/mingyongcheng/p/2097182.html
Copyright © 2011-2022 走看看