通过SQL Server的位运算功能巧妙解决多选查询方法
无论使用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
Select *
From Customer
Where [Status] & @Status = [Status]
Select *
From Customer
Where ( @Status is null Or [Status] & @Status = [Status])
用这样一条简单的语句,就可以获取到所有符合@Status要求的数据行。
相关推荐
-
详细介绍Python语言中的按位运算符
按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下: 按位与 ( bitwise and of x and y ) & 举例: 5&3 = 1 解释: 101 11 相同位仅为个位1 ,故结果为 1 按位或 ( bitwise or of x and y ) | 举例: 5|3 = 7 解释: 101 11 出现1的位是 1 1 1,故结果为 111 按位异或 ( bitwise exclusive or of x and y ) ^ 举例:
-
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Erlang的比较运算符 opDescription==等于/=不等于=<小于等于<小于>=大于等于>大于=:=精确的等于=/=精确的不等于等于和精确等于的区别: 如果要比较两个数,如果两个数之间是不同的类型,比如float和int那么,==操作会首先把两个数字转换成相同的相同类型.举例: 1> 1==1.0. true 2> 1=:=1.0. false 所以一般推荐用精确等于去比较 比较运算符的大小级别: number < atom < referenc
-
图文详解C语言位运算基础知识
C语言位运算基础知识分享给大家,希望对大家有帮助. 1. 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作. 2. 与运算:只有前后两个运算数都是 1 的时候结果才是1. 3. 或运算:有1位为1,结果便为1. 4. 异或:不相同则为1. 5. 取反运算:将1变为0,将0变为1. 6. 移位运算:左移则乘2,右移则除2.如果超出边界,则舍弃. 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.
-
C语言位运算符:与、或、异或、取反、左移与右移详细介绍
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将
-
C#枚举中的位运算权限分配浅谈
常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第一步, 先建立一个枚举表示所有的权限管理操作: 复制代码 代码如下: [Flags] public enum Permissions { Insert = 1, Delete = 2, Update = 4, Query = 8 } [Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的
-
JavaScript按位运算符的应用简析
大多数语言都提供了按位运算符,按位运算符在c,c++等语言中运用广泛,而在JS,AS等脚本语言中则没有太多的应用例子,有时候,适当的使用按位运算符会取得很好的效果.下面根据自己的认知简单的谈一下js中的位操作使用(同样适用于其他语言),如果有错误,欢迎指正. 按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位":数值或字符在内存内都是被存储为0和1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内被存储为 0 0 0 0 0 0
-
shell 基本计算、逻辑运算、位运算详解
以下面的格式提供运算表达式:$(( expression )) $ echo $((5*(3+3))) 30 $ result = $(($myvar-10)) shell提供方便的数之间的进制转换: $ echo $((013))#八进制 $ echo $((0xA4))#十六进制 还可以使用以下格式指定 2 到 64 之间的任意进制: $((BASE#NUMBER)) echo $((8#377)) echo $((16#D8)) 在 Shell 中进行进制转换的另一个诀窍是使用 bc, 它
-
c语言中用位运算实现加法技巧介绍
用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,在不考虑进位的基础上,如下 复制代码 代码如下: 1 + 1 = 0 1 + 0 = 1 0 + 1 = 1 0 + 0 = 0 很明显这几个表达式可以用位运算的"^"来代替,如下 复制代码 代码如下: 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0 这样我们就完成了简单的一位数加法,那么要进行二位的加法,这个方法可行不可行呢?肯定是不行的,矛盾
-
Java中位运算(移位、位与、或、异或、非) 的简单实例
复制代码 代码如下: public class Test { public static void main(String[] args) { // 1.左移( << ) // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.pri
-
C# 位运算符整理
C#支持的位逻辑运算符如表2.9所示. 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑非运算 整型,字符型 整型 1 ~a & 位逻辑与运算 2 a & b | 位逻辑或运算 2 a | b ^ 位逻辑异或运算 2 a ^ b << 位左移运算 2 a<<4 >> 位右移运算 2 a>>2 1.位逻辑非运算 位逻辑非运算是单目的,只有一个运算对象.位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其
随机推荐
- excel vba 限制工作表的滚动区域代码
- Lua教程(十五):输入输出库(I/O库)
- 某集团任意文件下载到虚拟主机getshell的方法
- java集合类arraylist循环中删除特定元素的方法
- Python学习笔记(二)基础语法
- VS2015 搭建Asp.net core开发环境的方法
- Js实现简单的小球运动特效
- javascript拖拽应用实例
- DataGrid中实现超链接的3种方法
- c#只读字段和常量的区别,以及静态构造函数的使用实例
- Laravel 5框架学习之环境与配置
- 解析php session_set_save_handler 函数的用法(mysql)
- c语言冒泡排序法代码
- JS实现CheckBox复选框全选全不选功能
- ModelDialog JavaScript模态对话框类代码
- ajax设置async校验用户名是否存在的实现方法
- 多用多学之Java中的Set,List,Map详解
- Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端
- js控制div层的叠加简单方法
- 发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载