DB2的函数(实现按位与或)

  CREATE   TABLE  mytab
       (name 
varchar ( 30 not   null ,
        age  
int   not   null ,
        flag1 
smallint   NOT   NULL ,      
        flag2 
smallint   NOT   NULL ); 
        

select  NAME, AGE, FLAG1, FLAG2
  
from  UU.MYTAB;
  
  --转化为二进制
CREATE   FUNCTION  int_to_binary (N1  Integer )
RETURNS   varchar ( 32 )
LANGUAGE SQL
SPECIFIC int2bin
BEGIN  ATOMIC
DECLARE  M1, i,  len    Integer   default   0 ;
DECLARE   temp_str  varchar ( 32 default   '   ' ;
DECLARE   result_str  varchar ( 32 default   '   ' ;
  
SET  M1  =  N1;
  
WHILE   M1  >   0   DO
   
SET  temp_str  =  temp_str  ||   cast (mod(m1, 2 as   char ( 1 ));
   
set  m1  =  m1 / 2 ;
  
END   WHILE ;
    
set   len   =  length (temp_str);
    
while  i  <   len  do
       
set  result_str  =  result_str  ||  substr(temp_str, len - i, 1 );
       
set  i  =  i + 1 ;
    
end   while ;
RETURN  result_str;
END  


select  int_to_binary( 8 from  mytab;

drop   function  int_to_binary;

--按位与

--按位或
CREATE   FUNCTION  BITOR (N1  Integer , N2  Integer )
RETURNS   Integer
LANGUAGE SQL
SPECIFIC BITORCONV  
BEGIN  ATOMIC
DECLARE  M1, M2, S , temp1  Integer ;
DECLARE  RetVal  Integer   DEFAULT   0
SET  (M1, M2, S)  =  (N1, N2,  0 );   
WHILE  ( M1  >   0   OR  M2  >    0 AND  S  <   32  DO  
      
IF  MOD(M1, 2 ) = 0   AND  MOD(M2, 2 ) = 0   THEN
           
SET  temp1 =   0 ;
      
ELSE
            
SET  temp1 = 1 ;
      
END   IF ;
  
SET  RetVal  =  RetVal  +  temp1 * power ( 2 ,S);
  
SET  (M1, M2, S)  =  (M1 / 2 , M2 / 2 , S + 1 );
END   WHILE ;   
RETURN  RetVal;
END  

select  BITAND( 8 , 12 from  mytab;
CREATE   FUNCTION  BITAND (N1  Integer , N2  Integer )
RETURNS   Integer
LANGUAGE SQL
SPECIFIC BITANDOracle
CONTAINS  SQL
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN  ATOMIC
DECLARE  M1, M2, S  Integer ;
DECLARE  RetVal  Integer   DEFAULT   0 ;
SET  (M1, M2, S)  =  (N1, N2,  0 );
WHILE  M1  >   0   AND  M2  >   0   AND  S  <   32  DO
   
SET  RetVal  =  RetVal  +  MOD(M1, 2 ) * MOD(M2, 2 ) * power ( 2 ,S);
   
SET  (M1, M2, S)  =  (M1 / 2 , M2 / 2 , S + 1 );
END   WHILE ;
RETURN  RetVal;
END  

select  BITAND( 8 , 12 from  mytab;
select   power ( 2 , 4 from  mytab;
       
      
drop   function  BIT_OR;

 

不过现在内存空间大了,像这样巧的按位操作来实现的方法似乎已经过时了,哎~~ 进行途中就放弃了写这样的函数来实现按位的操作。这样的设计大大的影响了索引的效率。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值