• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

巧用SQL语句完成位操作

数据库技术 开心 2889次浏览 0个评论

    数据库中,有些字段其值是按位表示的,即不同的位有不同的含义,比如用不同的位代表用户的不同权限或属性,该位为1时,表示用户有此权限或属性,为0则无此权限或属性等。相信有很多数据库为了效率也有类似的设计。

    在C语言中提供了&, |, ~以及>>,

1. func_bitoper

    我们在工作中常常有这样的需求,要求将某个字段的某一位或多位置为1或0,输入参数in_value是待处理的值,enable_mask表示要将哪几位置为1,如要将bit0和bit2置为1,则enable_mask := POWER(2,0) + POWER(2,2); ,enable_mask为0表示没有需要置为1的位,同理disable_mask表示要将哪几位置为0,如要将bit1和bit3置为0,则disable_mask := POWER(2,1) + POWER(2,3); ,disable_mask为0表示没有需要置为0的位, 返回值为经过位操作后的值。

    换句话说,enable动作相当于与enable_mask进行或操作,disable动作相当于与~disable_mask进行与操作。

create or replace function func_bitoper(in_value IN NUMBER,enable_mask IN NUMBER,

       disable_mask IN NUMBER ) return NUMBER IS

 

 l_enable    number;

 l_disable   number;

 i           number;

 j           number;

 l_outvalue  number;

 l_temp      number;

begin

 l_enable   := enable_mask;

 l_disable  := disable_mask;

 l_outvalue := in_value;

 

 — enable

 j := 0;

 while l_enable > 0 loop

  

   if MOD(l_enable,2) = 1 then              — to do set work

      l_temp :=TRUNC(l_outvalue/POWER(2,j));

      if MOD (l_temp,2) = 0 then            — set it to 1

         l_outvalue := l_outvalue + POWER(2,j);

      end if; 

   end if;

   l_enable := TRUNC(l_enable/2);

   j := j+1 ;

 end loop;

 — disable

 j := 0;

 while l_disable > 0 loop

  

   if MOD(l_disable,2) = 1 then              — to do set work

      l_temp :=TRUNC(l_outvalue/POWER(2,j));

      if MOD (l_temp,2) = 1 then            — set it to 0

         l_outvalue := l_outvalue – POWER(2,j);

      end if; 

   end if;

   l_disable := TRUNC(l_disable/2);

   j := j+1 ;

 end loop;

 return l_outvalue;

end;

/

2. func_and

   用于对两个数进行与操作,经常用于判断用户是否有权限等。

create or replace function func_and(in_value IN NUMBER,in_mask IN NUMBER)

  return number is

  i        number;

  n_result number;

  n_value number;

  n_mask  number;

begin

 n_value := in_value;

 n_mask  := in_mask;

 i := 0;

 n_result := n_value;

 while n_value > 0 loop

   if (mod(n_mask,2) = 0) and (mod(n_value,2) = 1) then

     n_result := n_result – power(2,i);

   end if;

   n_value := TRUNC(n_value/2);

   n_mask  := TRUNC(n_mask/2);

   i := i + 1;

 end loop;

 return n_result;

end;

/


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明巧用SQL语句完成位操作
喜欢 (0)

您必须 登录 才能发表评论!

加载中……