视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
通过SQLServer的位运算功能巧妙解决多选查询方法
2020-11-09 07:10:12 责编:小采
文档


无论使用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要求的数据行。

您可能感兴趣的文章:

  • C# 位运算符整理
  • Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
  • shell 基本计算、逻辑运算、位运算详解
  • c语言中用位运算实现加法技巧介绍
  • Java中位运算(移位、位与、或、异或、非) 的简单实例
  • C#枚举中的位运算权限分配浅谈
  • C语言位运算符:与、或、异或、取反、左移与右移详细介绍
  • 详细介绍Python语言中的按位运算符
  • JavaScript按位运算符的应用简析
  • 图文详解C语言位运算基础知识
  • 下载本文
    显示全文
    专题