ビットマップ構築関数は、新しいビットマップデータ型を生成するために使用されます。現在、OceanBase データベースでサポートされているビットマップ構築関数には、rb_build()、rb_build_empty()、rb_build_varbinary()、および rb_from_string() があります。
説明
16 進数形式で表示されるクエリ結果についての注意事項は、効率的に圧縮されたビットマップ列の作成 を参照してください。
rb_build
rb_build() 関数は、整数型の配列データを高効率圧縮ビットマップデータ(RoaringBitmap)へ変換します。構文は次のとおりです。
rb_build(arr)
入力パラメーターの説明:
arrは配列型である必要があります。
戻り値は、配列内のすべての要素を含む RoaringBitmap です。
制約事項:
- 配列には NULL 要素を含めることはできません。
- ネストされた配列の場合、各サブ配列の要素を再帰的に取り出し、RoaringBitmap に挿入します。
- RoaringBitmap は、符号なし 64 ビット整数(uint64)および符号付き 32 ビット整数(int32)の挿入をサポートします。後述の
rb_from_string()と同様に、入力された負の int32 値は、まず符号なし 32 ビット整数へ変換された後に RoaringBitmap へ格納されます。そのため、入力可能な整数の範囲は、符号付き 32 ビット整数の最小値から符号なし 64 ビット整数の最大値まで、すなわち[INT32_MIN, UINT64_MAX]です。
例:
SELECT rb_to_string(rb_build([1.2]));
ERROR 5083 (22000): Invalid data type for the operation
SELECT rb_to_string(rb_build([0,1,2]));
+---------------------------------+
| rb_to_string(rb_build([0,1,2])) |
+---------------------------------+
| 0,1,2 |
+---------------------------------+
1 row in set
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() 関数は、空のビットマップデータを構築します。構文は次のとおりです。
rb_build_empty()
この関数に入力パラメーターはありません。
例:
SELECT rb_build_empty();
+------------------------------------+
| rb_build_empty() |
+------------------------------------+
| 0x0100 |
+------------------------------------+
1 row in set
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 独自形式であり、バージョン情報、タイプ情報、データ本体などで構成されるバイナリ形式です。構文は次のとおりです。
rb_build_varbinary(bin_str)
入力パラメーターは varbinary 文字列です。
例:
SELECT rb_to_string(rb_build_varbinary(x'0100'));
+-------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0100')) |
+-------------------------------------------+
| |
+-------------------------------------------+
1 row in set
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)。構文は次のとおりです。
rb_from_string(str)
入力文字列では INT32 および INT64 形式をサポートします。OceanBase で有効な値の範囲は [0, UINT64_MAX] です。ただし、PostgreSQL との互換性のため、[INT32_MIN, 0) の負整数も入力可能です。負整数は出力時に UINT32 の値へ変換されます。たとえば、-1 を入力すると 4294967295 が出力されます。
例:
SELECT rb_from_string('1,2,3');
+--------------------------------------------------+
| rb_from_string('1,2,3') |
+--------------------------------------------------+
| 0x010303010000000200000003000000 |
+--------------------------------------------------+
1 row in set
SELECT rb_to_string(rb_from_string('-1'));
+------------------------------------+
| rb_to_string(rb_from_string('-1')) |
+------------------------------------+
| 4294967295 |
+------------------------------------+
1 row in set
rb_select
ビットマップデータには、一連の非負整数が格納されます。rb_select() 関数は、指定した条件に基づいてビットマップデータから一部の範囲を抽出し、新しいビットマップデータとして返します。構文は次のとおりです。
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 | 出力範囲の終了値。 | いいえ |
計算手順:
範囲が指定されている場合、まず
[range_start, range_end)に含まれる要素を抽出します。reverseがfalseの場合は昇順で、trueの場合は降順で要素を取得します。rb_select()は指定された順序に従い、抽出された要素から出力開始位置を計算します。offsetを適用します。limitを適用します。最大でlimit個の要素を返します。範囲内の要素数がlimit未満の場合は、範囲内のすべての要素を返します。
戻り値はビットマップデータ型です。
例:
'10, 20, 30, 40, 50, 60, 70' の先頭 3 件を取得:
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 件を取得:
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 件を取得:
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 件を取得:
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 件のみ返却):
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