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

 更新时间:2012年01月09日 20:45:08   作者:  
项目中很多业务对象的数据表中都具有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要求的数据行。

相关文章

  • Sql Server中Substring函数的用法实例解析

    Sql Server中Substring函数的用法实例解析

    在sqlserver中substring函数是用来处理字符串的,常用于字符串截取了,下面我来给大家介绍下Sql Server中Substring函数的用法实例解析,需要的朋友参考下吧
    2016-12-12
  • Mysql8.0.17安装教程【推荐】

    Mysql8.0.17安装教程【推荐】

    本文通过图文并茂的形式给大家介绍了Mysql8.0.17安装,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 一次SQL查询优化原理分析(900W+数据从17s到300ms)

    一次SQL查询优化原理分析(900W+数据从17s到300ms)

    本文主要介绍了一次SQL查询优化原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • SQL Transcation的一些总结分享

    SQL Transcation的一些总结分享

    相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生异常和错误它就会触发事务回滚,从而确保了我们数据的一致性和安全性,下面我们将通过分四部分介绍事件(Transcation)
    2012-08-08
  • SQL优化经验总结

    SQL优化经验总结

    这篇文章主要内容是SQL优化经验总结,文章对SQL优化进行了详细介绍,需要的朋友可以参考下
    2015-08-08
  • SqlServer2016模糊匹配的三种方式及效率问题简析

    SqlServer2016模糊匹配的三种方式及效率问题简析

    这篇文章主要介绍了SqlServer2016模糊匹配的三种方式及效率问题,结合实例形式简单对比分析了SQL Server2016使用like语句、PATINDEX及CHATINDEX三种方式进行模糊匹配的相关使用方法及执行效率,需要的朋友可以参考下
    2018-07-07
  • MySql查询不区分大小写解决方案(两种)

    MySql查询不区分大小写解决方案(两种)

    在mysql中查询数据能不区分大小写吗,下面小编给大家通过两种方案解决MySql查询不区分大小写,有需要的朋友可以借鉴下
    2015-08-08
  • sqlserver连接错误之SQL评估期已过的问题解决

    sqlserver连接错误之SQL评估期已过的问题解决

    很久没用sqlserver了,现在出现评估期已过的问题,本文就介绍一下sqlserver连接错误之SQL评估期已过的问题解决,文中根据图文详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • SQL Server 总结复习(一)

    SQL Server 总结复习(一)

    写这篇文章,主要是总结最近学到的一些新知识,这些特性不一定是SQLSERVER最新版才有,大多数是2008新特性,有些甚至是更早。如果有不懂的地方,建议大家去百度谷歌搜搜,本文不做详细阐述,有错误的地方,欢迎大家批评指正
    2012-08-08
  • sql2000数据库清除重复数据的二种方法

    sql2000数据库清除重复数据的二种方法

    这篇文章主要介绍了sql2000数据库清除重复数据的二种方法,可以使用使用游标实现和sql语句实现,需要的朋友可以参考下
    2014-03-03

最新评论