All Products
Search
Document Center

PolarDB:varbitx

Last Updated:Mar 28, 2026

varbitx adalah ekstensi PolarDB for PostgreSQL yang menyediakan fungsi operasi bit-string lanjutan di luar yang ditawarkan oleh ekstensi varbit standar PostgreSQL. Gunakan ekstensi ini untuk manipulasi bit berkinerja tinggi dalam skenario seperti tagging profil pengguna real-time, kontrol akses iklan, dan sistem tiket.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Kluster PolarDB for PostgreSQL yang menjalankan PostgreSQL 11

Instal ekstensi

CREATE EXTENSION varbitx;

Untuk menghapus ekstensi:

DROP EXTENSION varbitx;

Fungsi

Semua fungsi menerima dan mengembalikan nilai varbit PostgreSQL standar. Posisi bit menggunakan pengindeksan berbasis nol (bit paling kiri berada di posisi 0).

Ekstraksi bit

FunctionDescriptionExample
get_bit(bits varbit, start int, count int) returns varbitMengembalikan count bit mulai dari posisi start.get_bit('111110000011', 3, 5)11000
get_bit_array(bits varbit, start int, count int, value int) returns int[]Mengambil count bit mulai dari start, lalu mengembalikan posisi bit yang nilainya sama dengan value (0 atau 1).get_bit_array('111110000011', 3, 5, 1)[3,4]
get_bit_array(bits varbit, value int, positions int[]) returns int[]Dari bit pada positions yang ditentukan, mengembalikan posisi bit yang nilainya sama dengan value (0 atau 1). Bit yang tidak tercantum dalam positions diabaikan.get_bit_array('111110000011', 1, array[1,5,6,7,10,11])[1,10,11]

Modifikasi bit

FunctionDescriptionExample
set_bit_array(bits varbit, value int, fill int, positions int[]) returns varbitMenetapkan bit pada positions yang diberikan ke nilai value (0 atau 1). Memperpanjang string bit jika diperlukan, mengisi bit baru dengan fill (0 atau 1).set_bit_array('111100001111', 0, 1, array[1,15])1011000011111110
set_bit_array(bits varbit, value int, fill int, positions int[], limit int) returns varbitSama seperti di atas, tetapi berhenti setelah memproses limit posisi.set_bit_array('111100001111', 1, 0, array[4,5,6,7], 2)111111001111
set_bit_array_record(bits varbit, value int, fill int, positions int[]) returns (varbit, int[])Menetapkan bit pada positions yang diberikan ke nilai value (0 atau 1), memperpanjang dengan fill jika diperlukan, dan mengembalikan string bit yang telah diperbarui beserta posisi yang diubah.set_bit_array_record('111100001111', 0, 1, array[1,15])1011000011111110, [1,15]
set_bit_array_record(bits varbit, value int, fill int, positions int[], limit int) returns (varbit, int[])Sama seperti di atas, tetapi berhenti setelah mengubah limit bit. Mengembalikan string bit yang telah diperbarui dan posisi yang benar-benar diubah.set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2)111111001111, [4,5]

Generasi bit

FunctionDescriptionExample
bit_fill(value int, count int) returns varbitMengembalikan string bit sepanjang count bit yang semuanya diatur ke nilai value (0 atau 1).bit_fill(0, 10)0000000000
bit_rand(count int, value int, ratio float) returns varbitMengembalikan string bit sepanjang count bit di mana sekitar ratio bit diatur ke nilai value (0 atau 1), didistribusikan secara acak.bit_rand(10, 1, 0.3) dapat mengembalikan 0101000001

Penghitungan bit

FunctionDescriptionExample
bit_count(bits varbit, value int) returns intMenghitung semua bit yang nilainya sama dengan value (0 atau 1).bit_count('1111000011110000', 1)8
bit_count(bits varbit, value int, start int, count int) returns intMenghitung bit yang nilainya sama dengan value dalam rentang count bit mulai dari posisi start. Bit di luar panjang string bit tidak dihitung.bit_count('1111000011110000', 1, 5, 4)1
bit_count_array(bits varbit, value int, positions int[]) returns intMenghitung bit pada positions yang ditentukan yang nilainya sama dengan value (0 atau 1).bit_count_array('1111000011110000', 1, array[1,2,7,8])3

Pencarian posisi

FunctionDescriptionExample
bit_posite(bits varbit, value int, ascending boolean) returns int[]Mengembalikan posisi semua bit yang nilainya sama dengan value (0 atau 1). Berikan true untuk urutan ascending, false untuk descending.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(bits varbit, value int, limit int, ascending boolean) returns int[]Mengembalikan hingga limit posisi bit yang nilainya sama dengan value (0 atau 1). Berikan true untuk urutan ascending, false untuk descending.bit_posite('11110010011', 1, 3, true)[0,1,2]; bit_posite('11110010011', 1, 3, false)[10,9,6]

Contoh penggunaan

Contoh berikut menunjukkan alur kerja khas untuk sistem tagging pengguna: buat tabel dengan kolom varbit, masukkan data, dan lakukan kueri menggunakan fungsi varbitx.

Buat tabel dengan kolom varbit

CREATE TABLE user_tags (
    user_id   integer,
    tag_bits  varbit
);

Masukkan data varbit

INSERT INTO user_tags VALUES (1, '1111000011110000');
INSERT INTO user_tags VALUES (2, '1011000011111110');
INSERT INTO user_tags VALUES (3, '0000111100001111');

Hitung jumlah tag aktif per pengguna

Hitung bit yang diatur ke 1 (tag aktif) untuk setiap pengguna:

SELECT user_id, bit_count(tag_bits, 1) AS active_tag_count
FROM user_tags;

Output yang diharapkan:

 user_id | active_tag_count
---------+------------------
       1 |                8
       2 |               10
       3 |                8
(3 rows)

Filter pengguna berdasarkan posisi tag

Cari pengguna yang memiliki tag di posisi 0 yang diaktifkan:

SELECT user_id
FROM user_tags
WHERE get_bit(tag_bits, 0, 1) = B'1';

Aktifkan tag tertentu dan catat perubahan

Gunakan set_bit_array_record untuk mengaktifkan tag pada posisi tertentu dan mengembalikan posisi yang berubah:

SELECT user_id,
       set_bit_array_record(tag_bits, 1, 0, array[1,4,5,6,7], 2)
FROM user_tags
WHERE user_id = 1;

Output yang diharapkan:

 user_id | set_bit_array_record
---------+----------------------
       1 | (1111110011110000,"{4,5}")
(1 row)