SQL语句中取反运算

来源:互联网 发布:天音淘宝客软件价格 编辑:程序博客网 时间:2024/06/07 14:55
flat=~flat  
  ~(按位   NOT)  
  在   Transact-SQL   语句中,将某个给定的整型值转换为二进制表达式,对其执行按位逻辑非运算。  
   
  语法  
  ~   expression  
   
  参数  
  expression  
   
  是任何有效的   Microsoft®   SQL   Server™   表达式(表达式必须由整数数据类型分类中的任何数据类型组成,或者由   binary   或   varbinary   数据类型组成)。expression   是一个经过处理并转换为二进制数字以便进行位运算的整数。  
   
  结果类型  
  如果输入值为   int,则返回   int;如果输入值为   smallint,则返回   smallint;如果输入值为   tinyint,则返回   tinyint;或者如果输入值为   bit,则返回   bit。  
   
  注释  
  通过从两个表达式取对应的位,位运算符   ~   对   expression   执行按位逻辑非运算。如果   expression   中某个位(正在被解析的当前位)的值为   0,则结果中该位的值被设置为   1;否则,结果中该位的值将被清除为   0。  
   
  位运算符   ~   只可以用在整数类型分类的列上。  
   
   
   
  重要     每当执行任意类型的位运算时,位运算中所使用的表达式的存储长度是非常重要的。建议在存储值时,使用相同的字节数。例如,将十进制数   5   存储为   tinyint、smallint   或   int   数据类型时,所生成的值将用不同的字节数存储。tinyint   用   1   个字节存储数据,smallint   用   2   个字节存储数据,int   用   4   个字节存储数据。因此,与直接进行二进制或十六进制转换相比,在一个   int   数据类型的十进制数上执行位运算会产生不同的结果,当使用   ~(按位   NOT)运算符时,尤其如此。按位   NOT   运算可以对长度较小的变量执行操作,但是当该变量转换为较长的数据类型时,则高   8   位的值就有可能与期望的值不同。建议先将数据类型较小的变量转换为较大的数据类型,然后对所得的结果执行按位   NOT   运算。  
   
   
  示例  
  下面的示例创建一个具有   int   数据类型的表以显示值,并将该表放入一行中。    
   
  USE   master  
  GO  
  IF   EXISTS   (SELECT   *   FROM   INFORMATION_SCHEMA.TABLES    
              WHERE   TABLE_NAME   =   'bitwise')  
        DROP   TABLE   bitwise  
  GO  
  CREATE   TABLE   bitwise  
  (    
    a_int_value   tinyint   NOT   NULL,  
  b_int_value   tinyint   NOT   NULL  
  )  
  GO  
  INSERT   bitwise   VALUES   (170,   75)  
  GO  
   
  下面的查询在   a_int_value   列和   b_int_value   列上执行按位   NOT   运算。  
   
  USE   MASTER  
  GO  
  SELECT   ~   a_int_value,   ~   b_int_value  
  FROM   bitwise  
   
  下面是结果集:  
   
  ---   ---    
  85     180    
   
  (1   row(s)   affected)  
   
  170(a_int_value   或   A,如下所示)的二进制表示为   0000   0000   1010   1010。在该值上执行按位   NOT   运算所产生的二进制结果是   0000   0000   0101   0101,即十进制数   85。  
   
    (~A)        
                    0000   0000   1010   1010  
                    -------------------  
                    0000   0000   0101   0101