跳到主要内容
版本:V1.0.0

位图输出函数

位图输出函数用于选择位图数据输出形式,如以字符串的形式依次输出位图数据的每一个元素,并以逗号隔开。seekdb 当前所支持的位图输出函数包括 rb_to_varbinary()rb_to_string()rb_to_array()

rb_to_varbinary

rb_to_varbinary() 函数用于以 varbinary 的形式输出位图数据。语法如下:

rb_to_varbinary(rb, [format])

format 参数可选,如需配置当前仅支持 roaring。配置后,输出的二进制数据类型只有 BITMAP_32 和 BITMAP_64 两种兼容格式。如果不配置 format,则默认输出格式为 seekdb 类型的 varbinary 格式(包含 BITMAP_32 和 BITMAP_6 在内的 7 种子类型)。

示例如下:

SELECT rb_to_varbinary((1,2,3));
+------------------------------------------------------------------------------------+
| rb_to_varbinary(rb_from_string('1,2,3')) |
+------------------------------------------------------------------------------------+
| 0x010303010000000200000003000000 |
+------------------------------------------------------------------------------------+
1 row in set (0.001 sec)
SELECT rb_to_varbinary((1,2,3),'roaring');
+----------------------------------------------------------------------------------------------------------+
| rb_to_varbinary(rb_from_string('1,2,3'), 'roaring') |
+----------------------------------------------------------------------------------------------------------+
| 0x01053A300000010000000000020010000000010002000300 |
+----------------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

rb_to_string

rb_to_string() 函数以字符串的形式依次输出位图数据的每一个元素,并以逗号隔开。其中元素的输出格式为 UINT64,输出的最大元素个数为 1000000。语法如下:

rb_to_string(rb)

示例如下:

SELECT rb_to_string(rb_from_string('1,2,3'));
+---------------------------------------+
| rb_to_string(rb_from_string('1,2,3')) |
+---------------------------------------+
| 1,2,3 |
+---------------------------------------+
1 row in set (0.001 sec)
SELECT rb_to_string(x'010101000000');
+-------------------------------+
| rb_to_string(x'010101000000') |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.001 sec)

rb_iterate

rb_iterate() 函数将位图数据的值展开为一列多行。该函数可以在 SELECT 后使用,也可以在 FROM 后使用:

  • SELECT 后使用时,若用了多个 rb_iterate() 函数,将会返回多列,列名默认为 rb_iterate。返回的行数为最大行数,较少的列以 NULL 值来填充多余的行。

  • FROM 后使用时,若用了多个 rb_iterate() 函数,则相当于依次对返回的表做 JOIN 操作,返回行数为笛卡尔积。语法如下:

table = rb_iterate(rb) [AS] [alias]

参数说明如下:

参数数据类型默认值描述必选
rbRoaringBitmap需要进行输出的位图数据。
aliaStringrb_iterate别名。可以加 AS 关键词也可以不加。

返回值为一个 uint64 类型的一列多行的表。

示例如下:

SELECT rb_iterate(rb_from_string('1,2,3'));
+------------+
| rb_iterate |
+------------+
| 1 |
| 2 |
| 3 |
+------------+
3 rows in set (0.002 sec)

FROM 后使用多个 rb_iterate() 函数,示例如下:

SELECT * FROM rb_iterate(rb_from_string('1,2,3')) AS t1, rb_iterate(rb_from_string('11,22')) AS t2;
+------+------+
| t1 | t2 |
+------+------+
| 1 | 11 |
| 1 | 22 |
| 2 | 11 |
| 2 | 22 |
| 3 | 11 |
| 3 | 22 |
+------+------+
6 rows in set (0.003 sec)

SELECT 后使用多个 rb_iterate() 函数会返回多列,示例如下:

SELECT rb_iterate(rb_from_string('1,2,3')), rb_iterate(rb_from_string('11,22'));
+------------+------------+
| rb_iterate | rb_iterate |
+------------+------------+
| 1 | 11 |
| 2 | 22 |
| 3 | NULL |
+------------+------------+
3 rows in set (0.002 sec)
CREATE TABLE t1 (id int, rb roaringbitmap, rb2 roaringbitmap);
INSERT INTO t1 VALUES (1, rb_from_string('1,2,3'), rb_from_string('33,44')),(2, rb_from_string('3,4'), rb_from_string('44,55,66'));
SELECT rb_iterate(rb) FROM t1;
+------------+
| rb_iterate |
+------------+
| 1 |
| 2 |
| 3 |
| 3 |
| 4 |
+------------+
5 rows in set (0.002 sec)

rb_to_array

rb_to_array() 函数用于以数组的形式输出位图数据。语法如下:

rb_to_array(rb)

该函数输入参数为一个位图数据。

返回值为一个有序数组。

示例如下:

SELECT rb_to_array(rb_from_string('0,1,2,3,4,5,6,7,8,9,123789,68719476736'));
+-----------------------------------------------------------------------+
| rb_to_array(rb_from_string('0,1,2,3,4,5,6,7,8,9,123789,68719476736')) |
+-----------------------------------------------------------------------+
| [0,1,2,3,4,5,6,7,8,9,123789,68719476736] |
+-----------------------------------------------------------------------+
1 row in set (0.001 sec)