位图输出函数
位图输出函数用于选择位图数据输出形式,如以字符串的形式依次输出位图数据的每一个元素,并以逗号隔开。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]
参数说明如下:
| 参数 | 数据 类型 | 默认值 | 描述 | 必选 |
|---|---|---|---|---|
| rb | RoaringBitmap | 需要进行输出的位图数据。 | 是 | |
| alia | String | rb_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)