PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

9.6. 位串函数与操作符 #

本节描述用于检查和操作位串的函数和操作符, 位串就是 bit 和 bit varying 类型的值。 (虽然这些表中只提到了 bit 类型, 但 bit varying 类型的值可以互换使用。) 位串支持 Table 9.1 中展示的常规比较操作符, 以及 Table 9.14 中展示的操作符。

Table 9.14. 位串操作符

操作符

说明

示例

bit || bit → bit

串接

B'10001' || B'011' → 10001011

bit & bit → bit

按位与 (输入必须具有相同的长度)

B'10001' & B'01101' → 00001

bit | bit → bit

按位或 (输入必须具有相同的长度)

B'10001' | B'01101' → 11101

bit # bit → bit

按位异或 (输入必须具有相同的长度)

B'10001' # B'01101' → 11100

~ bit → bit

按位取反

~ B'10001' → 01110

bit << integer → bit

按位左移 (字符串长度被保留)

B'10001' << 3 → 01000

bit >> integer → bit

按位右移 (字符串长度被保留)

B'10001' >> 2 → 00100


一些可用于二进制字符串的函数同样可用于位串, 如 Table 9.15 所示。

Table 9.15. 位串函数

函数

说明

示例

bit_count ( bit ) → bigint

返回位串中被置位的位数 (也被称为 “popcount”)。

bit_count(B'10111') → 4

bit_length ( bit ) → integer

返回位串中的位数。

bit_length(B'10111') → 5

length ( bit ) → integer

返回位串中的位数。

length(B'10111') → 5

octet_length ( bit ) → integer

返回位串中的字节数。

octet_length(B'1011111011') → 2

overlay ( bits bit PLACING newsubstring bit FROM start integer [ FOR count integer ] ) → bit

把 bits 中从第 start 个位开始、 延续 count 个位的子串 替换为 newsubstring。 如果省略了 count, 它默认为 newsubstring 的长度。

overlay(B'01010101010101010' placing B'11111' from 2 for 3) → 0111110101010101010

position ( substring bit IN bits bit ) → integer

返回指定的 substring 在 bits 中的第一个起始索引, 如果不存在则返回零。

position(B'010' in B'000001101011') → 8

substring ( bits bit [ FROM start integer ] [ FOR count integer ] ) → bit

提取 bits 的子串, 从第 start 个位开始 (如果指定了的话), 并在 count 个位之后停止 (如果指定了的话)。 至少要提供 start 和 count 中的一个。

substring(B'110010111111' from 3 for 2) → 00

get_bit ( bits bit, n integer ) → integer

从位串中提取第 n 个位; 第一个 (最左边的) 位是位 0。

get_bit(B'101010101010101010', 6) → 1

set_bit ( bits bit, n integer, newvalue integer ) → bit

把位串中的第 n 个位设置为 newvalue; 第一个 (最左边的) 位是位 0。

set_bit(B'101010101010101010', 6, 0) → 101010001010101010


此外, 可以在整数值与 bit 类型之间进行转换。 把一个整数转换为 bit(n) 会复制最右边的 n 个位。 把一个整数转换为比该整数本身更宽的位串, 会在左侧做符号扩展。 一些例子:

44::bit(10)                    0000101100
44::bit(3)                     100
cast(-44 as bit(12))           111111010100
'1110'::bit(4)::integer        14

注意, 转换为单纯的 “bit” 意味着转换为 bit(1), 因此将只交付该整数的最低有效位。