ビットマップコンストラクタは、新しいビットマップデータ型を構築するために使用されます。OceanBaseデータベースが現在サポートしているビットマップ関数には、rb_build()、rb_build_empty()、rb_build_varbinary()、および rb_from_string() が含まれます。
説明
可視化された16進数のクエリ結果を返す際の注意点については、効率的な圧縮ビットマップ列の作成を参照してください。
rb_build
rb_build()関数は、基本型が整数の配列データを効率的に圧縮されたビットマップデータ(RoaringBitmap)に変換するために使用されます。構文は以下のとおりです:
rb_build(arr)
入力パラメータの説明は以下のとおりです:
arr渡される型は配列型でなければなりません。
戻り値は、配列のすべての要素を含むRoaringBitmapです。
制約は以下のとおりです:
- 配列には空の要素を含めることはできません。
- ネストされた配列の場合、各サブ配列の基本要素を再帰的に取り出し、Roaringbitmapに挿入します。
- Roaringbitmapは、符号なし64ビット整数(uint64)と符号付き32ビット整数(int32)のデータの挿入をサポートしています。以下の
rb_from_stringの動作と同じで、入力された符号付き32ビット整数の負の数は、まず符号なし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の2種類の形式をサポートしており、OceanBaseがサポートする有効な値の範囲は[0, UINT64_MAX]です。ただし、PGとの互換性のため、[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()関数は、reverseの方向に基づいて、フィルタリングされた要素から出力の開始位置を計算します。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
'1,2,3,4,5,6,7'の最初の2つの値を返します。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