[PostgreSQL] 在 PostgreSQL 中使用 bitwise-AND/OR 運算子,找出符合特定 bitmask 的資料

[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

(本頁面已被瀏覽過 150 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料