Plugin varbitx memperluas plugin varbit di ApsaraDB RDS for PostgreSQL dengan operasi string bit tambahan. Plugin varbit standar dari edisi komunitas PostgreSQL hanya mendukung fungsi tipe BIT dasar. varbitx menambahkan fungsi untuk slicing, pengaturan massal, pencarian posisi, dan penghitungan—mencakup kasus penggunaan seperti rekomendasi profil pengguna real-time, iklan berbasis kontrol akses, dan sistem tiket.
Prasyarat
Sebelum memulai, pastikan instans RDS Anda menjalankan salah satu versi PostgreSQL berikut:
PostgreSQL 11
PostgreSQL 10
Instalasi dan penghapusan plugin
Instal plugin varbitx:
CREATE EXTENSION varbitx;Hapus plugin:
DROP EXTENSION varbitx;Fungsi yang didukung
Panggil semua fungsi dengan pernyataan SELECT:
SELECT <function>;Bagian berikut mencantumkan setiap fungsi beserta signature, deskripsi, dan contoh penggunaannya dalam format input → output.
Fungsi ekstraksi
Fungsi yang membaca bit dari string bit tanpa mengubahnya.
| Function | Description | Example |
|---|---|---|
get_bit(varbit a, int b, int c) returns varbit | Mengembalikan c bit mulai dari posisi b sebagai string varbit. | get_bit('111110000011', 3, 5) → 11000 |
get_bit_array(varbit a, int b, int c, int d) returns int[] | Mengekstraksi c bit mulai dari posisi b, lalu mengembalikan posisi (berindeks 0) dari bit yang nilainya sama dengan d (0 atau 1). | get_bit_array('111110000011', 3, 5, 1) → [3,4] |
get_bit_array(varbit a, int b, int[] c) returns int[] | Membaca bit pada posisi yang ditentukan oleh array subskrip c, lalu mengembalikan posisi bit yang nilainya sama dengan b (0 atau 1). Posisi yang tidak ada di c diabaikan. | get_bit_array('111110000011', 1, array[1,5,6,7,10,11]) → [1,10,11] |
Fungsi mutasi
Fungsi yang mengembalikan salinan string bit yang telah dimodifikasi.
| Function | Description | Example |
|---|---|---|
set_bit_array(varbit a, int b, int c, int[] d) returns varbit | Mengatur bit pada posisi d ke nilai b (0 atau 1). Bit di luar panjang asli diisi dengan nilai c (0 atau 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 | Sama seperti bentuk 4 argumen, tetapi mengembalikan tepat e bit. | 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[]) | Mengatur bit pada posisi d ke nilai b (0 atau 1). Bit di luar panjang asli diisi dengan nilai c. Mengembalikan string bit yang telah dimodifikasi dan array subskrip dari posisi yang berubah. | 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[]) | Sama seperti bentuk 4 argumen, tetapi berhenti setelah mengubah e bit dan langsung mengembalikan hasil. | set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2) → 111111001111, [4,5] |
Fungsi pembangkit
Fungsi yang menghasilkan string bit baru.
| Function | Description | Example |
|---|---|---|
bit_fill(int a, int b) returns varbit | Mengembalikan string bit dengan panjang b yang seluruhnya diisi dengan nilai a (0 atau 1). | bit_fill(0, 10) → 0000000000 |
bit_rand(int a, int b, float c) returns varbit | Mengembalikan string bit dengan panjang a di mana sekitar c (0,0–1,0) dari bit secara acak diatur ke nilai b (0 atau 1). | bit_rand(10, 1, 0.3) dapat mengembalikan 0101000001 |
Fungsi penghitungan
Fungsi yang menghitung bit yang sesuai dengan nilai tertentu.
| Function | Description | Example |
|---|---|---|
bit_count(varbit a, int b, int c, int d) returns int | Menghitung bit dengan nilai b (0 atau 1), mulai dari posisi c, sepanjang d bit. Bit di luar rentang yang ditentukan tidak dihitung. | bit_count('1111000011110000', 1, 5, 4) → 1 |
bit_count(varbit a, int b) returns int | Menghitung semua bit dengan nilai b (0 atau 1) di seluruh string bit. | bit_count('1111000011110000', 1) → 8 |
bit_count_array(varbit a, int b, int[] c) returns int | Menghitung bit dengan nilai b (0 atau 1) pada posisi yang ditentukan oleh array subskrip c. | bit_count_array('1111000011110000', 1, array[1,2,7,8]) → 3 |
Fungsi pencarian posisi
Fungsi yang mengembalikan posisi bit yang sesuai dengan nilai tertentu.
| Function | Description | Example |
|---|---|---|
bit_posite(varbit a, int b, boolean c) returns int[] | Mengembalikan posisi (berindeks 0) dari semua bit dengan nilai b (0 atau 1). Berikan true untuk urutan menaik, false untuk urutan menurun. | 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[] | Mengembalikan hingga c posisi bit dengan nilai b (0 atau 1). Berikan true untuk urutan menaik, false untuk urutan menurun. | bit_posite('11110010011', 1, 3, true) → [0,1,2]; bit_posite('11110010011', 1, 3, false) → [10,9,6] |
Contoh
Menghitung bit yang bernilai 1 dalam suatu rentang
Hitung bit dengan nilai 1, mulai dari posisi 5, sepanjang 4 bit:
SELECT bit_count('1111000011110000', 1, 5, 4);Output:
bit_count
-----------
1
(1 row)Mengatur bit dan mengembalikan posisi yang berubah
Atur bit pada posisi 1, 4, 5, 6, dan 7 ke nilai 1, hentikan setelah mengubah 2 bit, dan kembalikan string yang telah dimodifikasi beserta posisi yang berubah:
SELECT set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2);Output:
set_bit_array_record
------------------------
(111111001111,"{4,5}")
(1 row)