位串操作函数和操作符

相比于原始的openGauss,dolphin对于位串函数的修改主要为:

  1. 新增bit_bool函数。
  2. 新增^操作符。
  3. 新增bit_count函数。
  4. 新增bit_xor函数。
  • bit_bool(bit)

    描述:根据位串中的数据返回布尔型(全部为零时返回false,否则返回true)。

    返回值类型:boolean

    示例:

    openGauss=# select bit_bool('11111');
     bit_bool 
    ----------
     t
    (1 row)
    
    openGauss=# select bit_bool('00001');
     bit_bool 
    ----------
     t
    (1 row)
    
    openGauss=# select bit_bool('00000');
     bit_bool 
    ----------
     f
    (1 row)
    
  • ^

    描述:实现bit类型数据的按位异或。

    返回值类型:根据左右两边操作数类型返回uint8类型或二进制字符串类型。

    注意:

    1. 当左右两边操作数不为二进制字符串类型或至少有一个操作数不是二进制字符串类型时,返回uint8类型结果。
    2. 当左右两边操作数都为二进制字符串类型时,返回与操作数长度相同、类型相同的二进制字符串结果。

    示例:

    openGauss=# select 11 ^ 3;
     ?column? 
    ----------
     8
    (1 row)
    
    openGauss=# select b'1001'^b'1100';
     ?column? 
    ----------
     5
    (1 row)
    
    openGauss=# select b'1001'::blob^b'1100'::blob;
     ?column? 
    ----------
     \x05
    (1 row)
    
  • bit_count(N)

    描述:返回输入数据转为无符号64位整数时二进制字符串中位为1的数目

    输入类型:numeric text bit

    返回值类型:整数

    注意: 当输入的数字或字符串数值超过无符号64位整数范围,返回结果统一为64;当输入的bit超过64个1时,返回结果为1.

    示例:

    openGauss=# SELECT bit_count(29);
     bit_count 
    ----------
     4
    (1 row)
    
    openGauss=# SELECT bit_count(b'101010');
     bit_count 
    ----------
     3
    (1 row)
    
  • bit_xor(expr)

    描述:返回表中所有列的值的异或,并返回按位转换成为无符号64位整数。

    输入类型:expr

    返回值类型:uint64

    注意:

    1. 该函数为聚合函数,如果最终结果为负数,会当作64位无符号数字返回。例如,-1,按位转换成64位无符号数字为18446744073709551615(2^64-1)。
    2. 单独调用该函数而不是从table中取数据(例如select bit_xor(1)),函数的边界值是64位有符号整数(-9223372036854775808 ~ 9223372036854775807),与MySQL不同。
    3. 对列类型是字符串类型的数据进行聚合(例如,text),会转换成数字再进行聚合,小数部分直接舍去(1.6 -> 1),如数字超过64位有符号整数范围,不会报错,同时,将数字截断至64位整数的上下界(-9223372036854775808 ~ 9223372036854775807)。
    4. 函数表现与mysql侧 select bit_xor(col) from table 相同,与直接select bit_xor()不同。

    示例:

    openGauss=# INSERT INTO bit_xor_int4(a) values(-1.11);
    INSERT 0 1
    openGauss=# SELECT BIT_XOR(a) from bit_xor_int4;
    bit_xor 
    ---------
    18446744073709551615
    (1 row)
    
    openGauss=# INSERT INTO bit_xor_int4(a) values(1.11);
    INSERT 0 1
    openGauss=# SELECT BIT_XOR(a) from bit_xor_int4;
    bit_xor 
    ---------
    18446744073709551614
    (1 row)
    
意见反馈
编组 3备份
    openGauss 2024-07-26 00:55:47
    取消