逻辑运算符"&"配合二进制实现一个字段表示多个判断条件的状态

与运算&

语法相同位的两个数字都为1,则为1;若有一个不为1,则为0

举例:10011001&00110010

10011001

&

00110010

---------------------------------------------------------------------------------------------------------

=00010000

从上面第例题,我们可以发现,我们可以利用与&运算判断二进制的某个数从0位到七位的任何一位数是0还是1;我们写一个判断的模板:只需要我们将需要判断的位数所对应的模板位数的值设置为1即可(不能设置为0,因为0和任何数&运算结果都是0,起不到判断作用)

例如下面的数:我们需要对他的第三位和第五位判断:

10110011

我们要得出所有第三位是0,第五位是1的数:**1* 0***

那么这个它对应的判断模板就要是:00101000

对应关系如下:

结果模板:**1* 0***

判断模板:00101000需要判断的位数对应模板值设为1)

**1* 0***&00101000=00100000

因此:任何数*********&00101000只要结果是00100000,就符合要求,就一定是**1* 0***格式;

总结:上面的步骤:

1、 确定我们要判断的二进制数的具体位数

2、 根据上面的结果写出模板

3、 计算出符合要求的二进制数与模板的计算结果

4、 用于判断即可

使用场景举例:

sql查询的时候,如果有很多条件需要我们判断,那么我们可以使用二进制,不同位数的值来表示不同的状态:实现一个字段表示很多种条件的状态!!!

MZ_SF表的STATE字段为例:

STATEBIT0: 0=未退款  1=退款0

;      BIT1: 0=未日结  1=已日结

;      BIT2: 0=挂号处收费  1=收费处收费

;      BIT3: 0=未重打发票  1=已重打发票

;      BIT4:0=参保  1==不参保

;      BIT5-6:

;        00=收费处处方  10=电子处方  

;        01=药房划价    11=体检处方

;      BIT7: 0=已收费  1=未收费7

 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑

那么01101001就表示:已收费,体检处方,参保,未重打发票,挂号处收费,未日结,退款状态的门诊收费数据;

那么我们就可以根据上面的方法判断具体的某个条件的状态;从而实现过滤查询的效果;

例题:

1、获取当天已收费未退款的所有处方。0*** ***0

2、获取当天已收费未退款已日结的所有处方。

3、获取当天已收费未退款已日结的电子处方。

答案

1

分析:第一题对应的结果模板是:0*** ***0

判断模板是1000 0001(转换成十进制是129

结果模板和判断模板运算结果是0*** ***0&1000 0001=0

因此sql为:

Select  *  from MZ_SF where state &129=0

state符合(state &129=0)的处方都查出来了

2

Select * from MZ_SF where state & 131 = 2  

3

Select * from MZ_SF where state & 227=66

猜你喜欢

转载自www.cnblogs.com/luzhanshi/p/13169822.html