[PostgreSQL] 在 PostgreSQL 中使用 bitwise-AND/OR 運算子,找出符合特定 bitmask 的資料
在程式語言裡面,蠻常會使用到 bitmask,
也就是一個整數值裡,每個位元 (bit) 都代表一個開關。
用程式來判斷很容易,像是 Python 可以用 & 運算子:
if (flag & 0x0001) != 0: # do something when flag is enabled...
今天遇到同樣的問題,但是這次的整數值被存進 PostgreSQL 資料庫裡了。
想要用 SQL 指令,找出帶有某個 bitmask 的資料的話,
要怎麼做呢?
看了一下原本的程式,呃,
看來是因為不知道怎麼做,
所以當作沒有 OR 這件事,直接去比較特定的值,像是:
SELECT * FROM tbl_test WHERE flag = 4;
這個寫法的問題是,假設目前 flag 的值是 4+1 = 5,
那理論上也符合 4 代表的 bitmask,應該要被選出來卻沒有…
查了一下,PostgreSQL 本身就支援 bitwise 的運算子,
像 & 代表 bitwise-AND,| 代表 bitwise-OR,
因此上面的 SQL 指令應該寫成:
SELECT * FROM tbl_test WHERE flag & 4 <> 0;
這樣之後在 PostgreSQL 裡也能根據 bitmask 來挑選符合的資料囉~
參考資料:
PostgreSQL Mathematical Operators – w3resource
PostgreSQL – Bitwise Operators
(本頁面已被瀏覽過 167 次)