---
title: "位图构造函数 - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: 位图构造函数 位图构造函数用于构建新的位图数据类型。OceanBase 数据库当前所支持的位图判断函数包括 rb_build() 、 rb_build_empty() 、 rb_build_varbinary() 和 rb_from_string() 。 说明 返回可视化的十六进制查询结果需了解的注意事项请见 创建高…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# 位图构造函数

更新时间：2026-04-12 16:38:48

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/400.functions-of-mysql-mode/940.roaring-bitmap-functions-of-mysql-mode/200.roaring-bitmap-constructor-functions-of-mysql-mode.md)  

位图构造函数用于构建新的位图数据类型。OceanBase 数据库当前所支持的位图判断函数包括 `rb_build()`、`rb_build_empty()`、`rb_build_varbinary()` 和 `rb_from_string()`。

#### 说明

返回可视化的十六进制查询结果需了解的注意事项请见[创建高效压缩位图列](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004481482)。

## rb_build

`rb_build()` 函数用于将基础类型为整数的数组数据转换为高效压缩位图数据（RoaringBitmap）。语法如下：

```sql
rb_build(arr)

```

输入参数说明如下：

- `arr` 传入的类型必须是一个数组类型。

返回值是包含了数组所有元素的 RoaringBitmap。

约束如下：

- 数组不可包含空元素。
 - 若数组为嵌套数组，递归取出每个子数组的基础元素，并插入到 Roaringbitmap 中。
 - Roaringbitmap 支持插入无符号 64 位整数（uint64）和有符号 32 位整数（int32）数据。与下文 `rb_from_string` 的行为一致，输入的有符号 32 位整数负数，将被先转换为无符号 32 位整数，再插入到 RoaringBitmap 中。因此允许输入的整数范围是从有符号 32 位整数的最小值到无符号 64 位整数的最大值，即 `[INT32_MIN, UINT64_MAX]`。

示例如下：

```sql
SELECT rb_to_string(rb_build([1.2]));
ERROR 5083 (22000): Invalid data type for the operation

```

```sql
SELECT rb_to_string(rb_build([0,1,2]));
+---------------------------------+
| rb_to_string(rb_build([0,1,2])) |
+---------------------------------+
| 0,1,2                           |
+---------------------------------+
1 row in set

```

```sql
SELECT rb_to_string(rb_build([[0,1],[2],[2,3]]));
+-------------------------------------------+
| rb_to_string(rb_build([[0,1],[2],[2,3]])) |
+-------------------------------------------+
| 0,1,2,3                                   |
+-------------------------------------------+
1 row in set

```

## rb_build_empty

`rb_build_empty()` 函数用于构建一个空的位图数据。语法如下：

```sql
rb_build_empty()

```

该函数无需输入参数。

示例如下：

```sql
SELECT rb_build_empty();
+------------------------------------+
| rb_build_empty()                   |
+------------------------------------+
| 0x0100                             |
+------------------------------------+
1 row in set

```

```sql
SELECT rb_is_empty(rb_build_empty());
+-------------------------------+
| rb_is_empty(rb_build_empty()) |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set

```

## rb_build_varbinary

`rb_build_varbinary()` 函数通过 varbinary 来构建位图数据。Varbinary 为 OceanBase 私有格式，是由 version 信息、type 信息、data 等部分组成的二进制格式。语法如下：

```sql
rb_build_varbinary(bin_str)

```

输入的参数为 varbinary 字符串。

示例如下：

```sql
SELECT rb_to_string(rb_build_varbinary(x'0100'));
+-------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0100')) |
+-------------------------------------------+
|                                           |
+-------------------------------------------+
1 row in set

```

```sql
SELECT rb_to_string(rb_build_varbinary(x'0103020100000002000000'));
+-------------------------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0103020100000002000000')) |
+-------------------------------------------------------------+
| 1,2                                                         |
+-------------------------------------------------------------+
1 row in set

```

## rb_from_string

`rb_from_string()` 函数通过特定格式的字符串来构建位图数据。字符串格式为需要构建的位图数据的每一个元素，并通过逗号隔开，如 `1,2,3,4`。语法如下：

```sql
rb_from_string(str)

```

输入的字符串值支持 INT32 和 INT64 两种格式，Oceanbase 支持的合法的值范围是 `[0, UINT64_MAX]`。但是为了兼容 PG，也支持 `[INT32_MIN,0)` 范围的负整数的输入，在输出时负整数会转换为 UINT32 的值输出，比如输入 `-1`，输出是 `4294967295`。

示例如下：

```sql
SELECT rb_from_string('1,2,3');
+--------------------------------------------------+
| rb_from_string('1,2,3')                          |
+--------------------------------------------------+
| 0x010303010000000200000003000000                 |
+--------------------------------------------------+
1 row in set

```

```sql
SELECT rb_to_string(rb_from_string('-1'));
+------------------------------------+
| rb_to_string(rb_from_string('-1')) |
+------------------------------------+
| 4294967295                         |
+------------------------------------+
1 row in set

```

## rb_select

位图数据储存一组非负整数。`rb_select()` 函数可以根据指定条件，从位图数据值选取局部范围，保存为新的位图数据并返回其值。语法如下：

```sql
res_rb = rb_select(rb, limit [, offset] [, reverse] [, range_start] [, range_end])

```

参数说明如下：

| **参数** | **数据类型** | **默认值** | **描述** | **必选** |
| --- | --- | --- | --- | --- |
| rb | RoaringBitmap |  | 需要输入的位图数据。 | 是 |
| limit | uint64 |  | 限制输出的元素数量。 | 是 |
| offset | uint64 | 0 | 开始输出的位置偏移量。 | 否 |
| reverse | bool | false | 是否是逆序输出。 | 否 |
| range_start | uint64 | 0 | 输出范围的开始值。 | 否 |
| range_end | uint64 | UINT64_MAX | 输出范围的结束值。 | 否 |

计算顺序如下：

1. 如果指定了范围，则先筛选出范围在 `[range_start,range_end)` 内的所有元素。
 2. 如果 `reverse` 为 `false`，则按照正序选取值；如果为 `true`，则逆序选取。`rb_select()` 函数会根据 reverse 的方向，从筛选出来的元素中计算出输出的起始位置。
 3. 计算 `offset`。
 4. 计算 `limit`，最多输出 `limit` 个范围内的数据，如果范围内的数据小于 `limit`，则输出范围内全部数据。

返回值为位图数据类型。

示例如下：

返回 `'10, 20, 30, 40, 50, 60, 70'` 的前 3 个值：

```sql
SELECT rb_to_string(rb_select(rb_from_string('10, 20, 30, 40, 50, 60, 70'), 3));
+--------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('10, 20, 30, 40, 50, 60, 70'), 3)) |
+--------------------------------------------------------------------------+
| 10,20,30                                                                 |
+--------------------------------------------------------------------------+
1 row in set

```

偏移 2 个值并返回 `'1,2,3,4,5,6,7'` 的前 2 个值：

```sql
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 2));
+----------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 2)) |
+----------------------------------------------------------------+
| 3,4                                                            |
+----------------------------------------------------------------+
1 row in set

```

从 [2, 6) 之间正序选取前 2 个值：

```sql
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 0, false, 2, 6));
+-----------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 0, false, 2, 6)) |
+-----------------------------------------------------------------------------+
| 2,3                                                                         |
+-----------------------------------------------------------------------------+
1 row in set

```

限定范围为 [2, 6) 的基础上，逆序偏移 1 个值计算结果，最终返回前 2 个值：

```sql
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 1, true, 2, 6));
+----------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 1, true, 2, 6)) |
+----------------------------------------------------------------------------+
| 3,4                                                                        |
+----------------------------------------------------------------------------+
1 row in set

```

限定范围为 [2, 6) 的基础上，正序偏移 1 个值计算结果，最终返回前 10 个值（实际返回了 3 个值）：

```sql
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 10, 1, false, 2, 6));
+------------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 10, 1, false, 2, 6)) |
+------------------------------------------------------------------------------+
| 3,4,5                                                                        |
+------------------------------------------------------------------------------+
1 row in set

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
