Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Bitmap Functions

Bitmap 可通过两种方式构造。第一种是使用带有 -State 的聚合函数 groupBitmap 进行构造,另一种是从 Array 对象构造 bitmap。

bitmapAnd

首次引入于:v20.1.0

计算两个 bitmap 的逻辑与 (AND) 。

语法

bitmapAnd(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,其中包含两个输入 bitmap 中都存在的位 AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapAnd(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res─┐
│ [3] │
└─────┘

bitmapAndCardinality

引入于:v20.1.0

返回两个 bitmap 逻辑与 (AND) 结果的基数。

语法

bitmapAndCardinality(bitmap1, bitmap2)

参数

返回值

返回两个 bitmap 交集中置为 1 的位数。UInt64

示例

用法示例

SELECT bitmapAndCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   1 │
└─────┘

bitmapAndnot

始于版本:v20.1.0

计算两个 bitmap 的集合差集 A AND-NOT B。

语法

bitmapAndnot(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,包含第一个 bitmap 中已置位但第二个 bitmap 中未置位的位 AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res───┐
│ [1,2] │
└───────┘

bitmapAndnotCardinality

引入版本:v20.1.0

返回两个 bitmap 进行 AND-NOT 运算后结果的基数。

语法

bitmapAndnotCardinality(bitmap1, bitmap2)

参数

返回值

返回 bitmap1 AND-NOT bitmap2 结果中置位的位数。UInt64

示例

使用示例

SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   2 │
└─────┘

bitmapBuild

引入版本:v20.1.0

根据整数数组构建 bitmap。支持的元素类型为 8、16、32 或 64 位有符号和无符号整数。它是函数 bitmapToArray 的逆操作。

语法

bitmapBuild(array)

参数

返回值

返回由给定数组构建的 bitmap AggregateFunction(groupBitmap, T)

示例

用法示例

-- A bitmap is a binary value, so it is shown with `hex`.
SELECT hex(bitmapBuild([1, 2, 3, 4, 5])) AS res, toTypeName(bitmapBuild([1, 2, 3, 4, 5])) AS type;
┌─res────────────┬─type──────────────────────────────────┐
│ 00050102030405 │ AggregateFunction(groupBitmap, UInt8) │
└────────────────┴───────────────────────────────────────┘

有符号 bitmap

-- A bitmap is a binary value, so it is shown with `hex`.
SELECT hex(bitmapBuild([-128, -1]::Array(Int8))) AS res, toTypeName(bitmapBuild([-128, -1]::Array(Int8))) AS type;
┌─res──────┬─type─────────────────────────────────┐
│ 000280FF │ AggregateFunction(groupBitmap, Int8) │
└──────────┴──────────────────────────────────────┘

bitmapCardinality

引入版本:v20.1.0

返回 bitmap 中置为 1 的位数 (即基数) 。

语法

bitmapCardinality(bitmap)

参数

返回值

返回 bitmap 中被置为 1 的位数。UInt64

示例

使用示例

SELECT bitmapCardinality(bitmapBuild([1, 3, 3, 5, 7, 7])) AS res
┌─res─┐
│   4 │
└─────┘

bitmapContains

引入版本:v20.1.0

检查 bitmap 是否包含指定元素。该值会按 bitmap 元素类型的无符号整数进行比较。对于有符号 bitmap,负元素会匹配其对应的无符号值 (例如,Int8-1 匹配 255) 。

语法

bitmapContains(bitmap, value)

参数

返回值

如果 bitmap 包含指定的值,则返回 1,否则返回 0UInt8

示例

使用示例

SELECT bitmapContains(bitmapBuild([1, 2, 3]), 2) AS res;
┌─res─┐
│   1 │
└─────┘

有符号 bitmap

SELECT bitmapContains(bitmapBuild([-1]::Array(Int8)), 255) AS res;
┌─res─┐
│   1 │
└─────┘

bitmapHasAll

引入版本:v20.1.0

检查第一个 bitmap 是否包含第二个 bitmap 中所有置位的位。

语法

bitmapHasAll(bitmap1, bitmap2)

参数

返回值

如果第二个 bitmap 中的所有置位都存在于第一个 bitmap 中,则返回 1,否则返回 0UInt8

示例

用法示例

SELECT bitmapHasAll(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3])) AS res;
┌─res─┐
│   1 │
└─────┘

bitmapHasAny

引入版本:v20.1.0

检查第一个 bitmap 是否包含第二个 bitmap 中任意置位。

语法

bitmapHasAny(bitmap1, bitmap2)

参数

返回值

如果第二个 bitmap 中的任意位出现在第一个 bitmap 中,则返回 1;否则返回 0UInt8

示例

使用示例

SELECT bitmapHasAny(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5])) AS res;
┌─res─┐
│   1 │
└─────┘

bitmapMax

引入版本:v20.1.0

返回 bitmap 中最大的元素,并将其解释为 bitmap 元素类型的无符号整数。对于有符号 bitmap,负值会被视为对应的无符号值 (例如,Int8-1255) 。如果 bitmap 为空,则返回 0

语法

bitmapMax(bitmap)

参数

返回值

返回 bitmap 中最大的元素,并以 bitmap 元素类型的无符号值表示;如果 bitmap 为空,则返回 0 UInt64

示例

使用示例

SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;
┌─res─┐
│   5 │
└─────┘

有符号 bitmap

SELECT bitmapMax(bitmapBuild([-128, -1]::Array(Int8))) AS res;
┌─res─┐
│ 255 │
└─────┘

bitmapMin

引入版本:v20.1.0

返回 bitmap 中最小的元素,并将其视为 bitmap 元素类型的无符号整数。对于有符号 bitmap,负值会被视为对应的无符号值 (例如,Int8-128 视为 128) 。如果 bitmap 为空,则返回 UINT32_MAX (如果 bitmap 元素类型宽于 32 位,则返回 UINT64_MAX) 。

语法

bitmapMin(bitmap)

参数

返回值

返回 bitmap 中最小的元素,以 bitmap 元素类型的无符号值表示;如果 bitmap 为空,则返回 UINT32_MAX/UINT64_MAX UInt64

示例

用法示例

SELECT bitmapMin(bitmapBuild([3, 5, 2, 6])) AS res;
┌─res─┐
│   2 │
└─────┘

有符号 bitmap

SELECT bitmapMin(bitmapBuild([-128, -1]::Array(Int8))) AS res;
┌─res─┐
│ 128 │
└─────┘

bitmapOr

引入版本:v20.1.0

计算两个 bitmap 的逻辑或 (OR) 。

语法

bitmapOr(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,包含任一输入 bitmap 中置位的位。AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapOr(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘

bitmapOrCardinality

引入版本:v20.1.0

返回两个 bitmap 逻辑或 (OR) 结果的基数。

语法

bitmapOrCardinality(bitmap1, bitmap2)

参数

返回值

返回两个 bitmap 并集中的置位数。UInt64

示例

用法示例

SELECT bitmapOrCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   5 │
└─────┘

bitmapSubsetInRange

引入版本:v20.1.0

返回 bitmap 的一个子集,其中包含值范围 [start, end) 内的元素。元素值按 bitmap 元素类型的无符号整数进行比较。

语法

bitmapSubsetInRange(bitmap, start, end)

参数

返回值

返回一个仅包含指定值范围内元素的 bitmap AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([1, 2, 3, 4, 5]), 2, 5)) AS res;
┌─res─────┐
│ [2,3,4] │
└─────────┘

bitmapSubsetLimit

引入版本:v20.1.0

返回一个最多包含 cardinality_limit 个元素的子集,其中元素值大于或等于 range_start,并按无符号顺序选取其中最小的值。

语法

bitmapSubsetLimit(bitmap, range_start, cardinality_limit)

参数

返回值

返回一个 bitmap,其中最多包含 cardinality_limit 个无符号值不小于 range_start 的元素。AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT arraySort(bitmapToArray(bitmapSubsetLimit(bitmapBuild([1, 5, 3, 2, 8]), 3, 2))) AS res;
┌─res───┐
│ [3,5] │
└───────┘

bitmapToArray

自 v20.1.0 引入

将 bitmap 转换为其元素组成的数组。数组元素类型与 bitmap 元素类型 T 一致 (有符号或无符号整数) 。它是函数 bitmapBuild 的逆操作。

语法

bitmapToArray(bitmap)

参数

返回值

返回 bitmap 中包含的元素数组 Array(T)

示例

使用示例

SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘

有符号 bitmap

SELECT arraySort(bitmapToArray(bitmapBuild([-128, -1]::Array(Int8)))) AS res;
┌─res───────┐
│ [-128,-1] │
└───────────┘

bitmapTransform

引入版本:v20.1.0

根据从 from_arrayto_array 的映射替换 bitmap 中的元素。 值会被解释为 bitmap 元素类型的无符号整数 (与 bitmapContains 位于同一值域) 。 对于有符号 bitmap,负元素会与其对应的无符号值匹配 (例如,Int8-1255 匹配) 。 to_array 中不适合 bitmap 元素类型的值会引发 BAD_ARGUMENTSfrom_array 中 不适合该类型的值不会被找到,因此不会应用相应的替换。

语法

bitmapTransform(bitmap, from_array, to_array)

参数

返回值

返回一个其元素已根据给定映射进行转换的 bitmap AggregateFunction(groupBitmap, T)

示例

用法示例

SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5]), [2, 4], [20, 40])) AS res;
┌─res───────────┐
│ [1,3,5,20,40] │
└───────────────┘

有符号 bitmap

SELECT arraySort(bitmapToArray(bitmapTransform(bitmapBuild([-1, 0]::Array(Int8)), [255], [10]))) AS res;
┌─res────┐
│ [0,10] │
└────────┘

bitmapXor

引入版本:v20.1.0

计算两个 bitmap 的对称差 (XOR) 。

语法

bitmapXor(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,包含存在于任一输入 bitmap 中但不同时存在于两者中的置位。AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapXor(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res───────┐
│ [1,2,4,5] │
└───────────┘

bitmapXorCardinality

引入版本:v20.1.0

返回两个 bitmap 的 XOR (对称差) 的基数。

语法

bitmapXorCardinality(bitmap1, bitmap2)

参数

返回值

返回两个 bitmap 的对称差中置位数 UInt64

示例

使用示例

SELECT bitmapXorCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   4 │
└─────┘

subBitmap

引入版本:v21.9.0

按无符号值升序跳过 offset 个元素后,返回 bitmap 的一个子集。返回的 bitmap 的最大基数为 cardinality_limit

语法

subBitmap(bitmap, offset, cardinality_limit)

参数

返回值

返回一个 bitmap,按无符号值升序跳过 offset 个元素后,最多包含 cardinality_limit 个元素。AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(subBitmap(bitmapBuild([1, 2, 3, 4, 5]), 2, 2)) AS res;
┌─res───┐
│ [3,4] │
└───────┘
Navigation