varbitx プラグインは、ApsaraDB RDS for PostgreSQL の varbit プラグインを拡張し、追加のビット文字列操作を提供します。PostgreSQL コミュニティ版の標準 varbit プラグインは、基本的な BIT 型の関数のみをサポートしています。varbitx は、スライシング、一括設定、位置検索、カウントなどの関数を追加し、リアルタイムのユーザープロファイル推奨、アクセス制御広告、チケット発券などのユースケースに対応します。
前提条件
開始する前に、ご利用の RDS インスタンスが次のいずれかの PostgreSQL バージョンで実行されていることを確認してください。
PostgreSQL 11
PostgreSQL 10
プラグインのインストールと削除
varbitx プラグインをインストールします。
CREATE EXTENSION varbitx;プラグインを削除します。
DROP EXTENSION varbitx;サポートされる関数
すべての関数は、SELECT 文で呼び出します。
SELECT <function>;以降のセクションでは、各関数をそのシグネチャ、説明、および 入力 → 出力 形式の実行例とともにリストアップします。
抽出関数
ビット文字列を変更せずにビットを読み取る関数です。
| 関数 | 説明 | 例 |
|---|---|---|
get_bit(varbit a, int b, int c) returns varbit | 位置 b から始まる c ビットを varbit 文字列として返します。 | get_bit('111110000011', 3, 5) → 11000 |
get_bit_array(varbit a, int b, int c, int d) returns int[] | 位置 b から c ビットを抽出し、値が d (0 または 1) に等しいビットの 0 から始まる位置を返します。 | get_bit_array('111110000011', 3, 5, 1) → [3,4] |
get_bit_array(varbit a, int b, int[] c) returns int[] | 添字配列 c で指定された位置のビットを読み取り、値が b (0 または 1) に等しいビットの位置を返します。c にない位置は無視されます。 | get_bit_array('111110000011', 1, array[1,5,6,7,10,11]) → [1,10,11] |
変更関数
ビット文字列の変更されたコピーを返す関数です。
| 関数 | 説明 | 例 |
|---|---|---|
set_bit_array(varbit a, int b, int c, int[] d) returns varbit | 位置 d のビットを値 b (0 または 1) に設定します。元の長さを超えるビットは、値 c (0 または 1) で埋められます。 | set_bit_array('111100001111', 0, 1, array[1,15]) → 1011000011111110 |
set_bit_array(varbit a, int b, int c, int[] d, int e) returns varbit | 4 引数形式と同じですが、正確に e ビットを返します。 | set_bit_array('111100001111', 1, 0, array[4,5,6,7], 2) → 111111001111 |
set_bit_array_record(varbit a, int b, int c, int[] d) returns (varbit, int[]) | 位置 d のビットを値 b (0 または 1) に設定します。元の長さを超えるビットは、値 c で埋められます。変更されたビット文字列と、変更された位置の添字配列の両方を返します。 | set_bit_array_record('111100001111', 0, 1, array[1,15]) → 1011000011111110, [1,15] |
set_bit_array_record(varbit a, int b, int c, int[] d, int e) returns (varbit, int[]) | 4 引数形式と同じですが、e ビットを変更した直後に停止して返します。 | set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2) → 111111001111, [4,5] |
生成関数
新しいビット文字列を生成する関数です。
| 関数 | 説明 | 例 |
|---|---|---|
bit_fill(int a, int b) returns varbit | 長さ b のビット文字列を、すべて値 a (0 または 1) で埋めて返します。 | bit_fill(0, 10) → 0000000000 |
bit_rand(int a, int b, float c) returns varbit | 長さ a のビット文字列を返します。この文字列では、ビットの約 c (0.0–1.0) がランダムに値 b (0 または 1) に設定されます。 | bit_rand(10, 1, 0.3) は 0101000001 |
カウント関数
指定された値に一致するビットをカウントする関数です。
| 関数 | 説明 | 例 |
|---|---|---|
bit_count(varbit a, int b, int c, int d) returns int | 位置 c から d ビットにわたり、値が b (0 または 1) のビットをカウントします。指定された範囲外のビットはカウントされません。 | bit_count('1111000011110000', 1, 5, 4) → 1 |
bit_count(varbit a, int b) returns int | ビット文字列全体で、値が b (0 または 1) のすべてのビットをカウントします。 | bit_count('1111000011110000', 1) → 8 |
bit_count_array(varbit a, int b, int[] c) returns int | 添字配列 c で指定された位置で、値が b (0 または 1) のビットをカウントします。 | bit_count_array('1111000011110000', 1, array[1,2,7,8]) → 3 |
位置検索関数
指定された値に一致するビットの位置を返す関数です。
| 関数 | 説明 | 例 |
|---|---|---|
bit_posite(varbit a, int b, boolean c) returns int[] | 値が b (0 または 1) のすべてのビットの 0 から始まる位置を返します。昇順の場合は true、降順の場合は false を渡します。 | bit_posite('11110010011', 1, true) → [0,1,2,3,6,9,10]; bit_posite('11110010011', 1, false) → [10,9,6,3,2,1,0] |
bit_posite(varbit a, int b, int c, boolean d) returns int[] | 値が b (0 または 1) のビットの位置を最大 c 個返します。昇順の場合は true、降順の場合は false を渡します。 | bit_posite('11110010011', 1, 3, true) → [0,1,2]; bit_posite('11110010011', 1, 3, false) → [10,9,6] |
例
範囲内のセットされたビットのカウント
値が 1 のビットを、位置 5 から 4 ビットにわたってカウントします。
SELECT bit_count('1111000011110000', 1, 5, 4);出力:
bit_count
-----------
1
(1 row)ビットのセットと変更された位置の返却
位置 1、4、5、6、7 のビットを値 1 に設定し、2 ビットを変更した後に停止し、変更された文字列と変更された位置を返します。
SELECT set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2);出力:
set_bit_array_record
------------------------
(111111001111,"{4,5}")
(1 row)