Postgresql

在postgres中將一長串數字標記/檢索為“真/假”

  • May 13, 2022

我有一長串來自0 to 10 million. 我想將這些數字中的每一個標記為true/false or set/unset。我想避免為每個數字創建一個包含一行的表,例如

CREATE TABLE foo (number integer, set boolean)

相反,我在想我可以做一些按位計算來儲存和檢索單個單元格中的這些數據。我可以在這裡使用Bit(N)數據類型嗎?

CREATE TABLE some_table (my_store BIT(1000000)) // 1 million

我應該如何在特定位置設置/取消設置/檢索位值?

編輯

我發現這BIT(10000000)給出了一個錯誤 is out of range for type integer

bit和type都bit varying可以儲存 1000 萬位的位遮罩(上限好像是 83886080)。但是為了能夠在那裡設置/獲取位,您需要預先初始化該值。set_bit()不會自動增加位串的大小(如果使用bit varying),並且get_bit()在嘗試訪問超出目前值長度的位時會拋出錯誤。

create table numbers (flags bit(10000000));
insert into numbers (flags)
values (repeat('0', 10000000)::bit(10000000));

這將創建一個具有 1000 萬位(全部設置為零)的位串。

請注意,位的編號從 開始0,而不是 1。因此,要測試“最後一個值”,您需要:

select get_bit(flags, 10e6::int - 1)
from numbers;

要更改值,請使用set_bit()設置數字 10000 的位

update numbers
  set flags = set_bit(flags, 10000 - 1, 1)

如果需要,您可以將邏輯包裝到函式中。

線上範例

從理論上講,您可以使用 abit varying來支持未知範圍的數字,您只需要有一些邏輯來擴展目前值以包含新的位位置,例如通過在新位和現有位之間附加適當數量的位到 “填補空缺”。

引用自:https://dba.stackexchange.com/questions/312069