Postgresql
在postgres中將一長串數字標記/檢索為“真/假”
我有一長串來自
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)
如果需要,您可以將邏輯包裝到函式中。
從理論上講,您可以使用 a
bit varying
來支持未知範圍的數字,您只需要有一些邏輯來擴展目前值以包含新的位位置,例如通過在新位和現有位之間附加適當數量的位到 “填補空缺”。