BITAND 是 Oracle 內建的位元 AND 運算函數,用於對兩個數值的二進制位元進行逐位邏輯 AND 運算。
BITAND(nExpression1, nExpression2)
對應位元皆為 1 時結果為 1,否則為 0:
| 運算元 1 位元 | 運算元 2 位元 | 結果位元 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
-- 範例:5 (0101) AND 6 (0110) = 4 (0100)
SELECT BITAND(5, 6) FROM dual; -- 返回 4
-- 二進制驗證
-- 5 = 0101
-- 6 = 0110
-- AND= 0100 = 4
SELECT BITAND(15, 7) FROM dual; -- 15=1111, 7=0111 → 0111=7
SELECT BITAND(255, 15) FROM dual; -- 255=11111111, 15=00001111 → 15
SELECT BITAND(100, 50) FROM dual; -- 100=1100100, 50=0110010 → 0100000=32
將多個布林旗標壓縮儲存於單一整數欄位,透過 BITAND 快速檢查:
-- 權限定義(位元掩碼)
-- 1 = 讀取權限 (0001)
-- 2 = 寫入權限 (0010)
-- 4 = 執行權限 (0100)
-- 8 = 管理權限 (1000)
-- 用戶權限值:7 = 1+2+4 (讀+寫+執行)
-- 檢查是否有寫入權限 (掩碼 2)
SELECT CASE WHEN BITAND(user_perm, 2) = 2 THEN 'YES' ELSE 'NO' END AS has_write
FROM users;
-- 批次查詢擁有「讀取且執行」權限的用戶 (掩碼 1+4=5)
SELECT * FROM users WHERE BITAND(user_perm, 5) = 5;
-- BITAND(n, 1) = 1 為奇數,= 0 為偶數
SELECT ename, sal,
CASE WHEN BITAND(sal, 1) = 1 THEN '奇數' ELSE '偶數' END AS parity
FROM emp;
-- 數值為 2 的冂次方時,BITAND(n, n-1) = 0
-- 例:8=1000, 7=0111 → AND=0
SELECT n FROM test_numbers WHERE BITAND(n, n-1) = 0 AND n > 0;
-- 提取低 8 位元(對應 0-255 範圍)
SELECT BITAND(color_value, 255) AS blue_channel FROM images;
-- 提取位元 4-7(右移 4 位後取低 4 位)
SELECT BITAND(color_value / 16, 15) AS green_channel FROM images;
Oracle 無內建 BITOR、BITXOR、BITNOT,可用 BITAND 組合模擬:
-- BITOR(a,b) = a + b - BITAND(a,b)
-- BITXOR(a,b) = a + b - 2*BITAND(a,b)
-- BITNOT(a) = -a - 1 (二補數表示)
-- 實用包裝函數範例
CREATE OR REPLACE FUNCTION bit_or(a NUMBER, b NUMBER) RETURN NUMBER AS
BEGIN
RETURN a + b - BITAND(a, b);
END;
/
TRUNC 為整數,注意精度損失| 特性 | BITAND | UTL_RAW.BIT_AND |
|---|---|---|
| 資料型別 | NUMBER | RAW (二進制) |
| 使用便利性 | SQL 直接呼叫 | 需 PL/SQL 環境 |
| 適用場景 | 數值旗標、權限掩碼 | 二進制資料流處理、加密演算法 |
BITAND 是 Oracle 中實現位元級運算的核心函數,雖然功能單一,但配合位元掩碼設計模式,能以極高效能解決權限控制、狀態旗標、特徵向量等多種業務問題。掌握位元思維,將多個布林屬性壓縮為單一整數,是資料庫設計優化的重要技巧之一。