在 SQL Server / Oracle 等資料庫中定義 CHECK 約束時,常見寫法:
ALTER TABLE Salary
ADD CONSTRAINT check_salary CHECK (
CASE WHEN sex = '2' THEN CASE WHEN salary > 1000 THEN 1 ELSE 0 END
ELSE 1 END = 1
)
初學者常問:為什麼最後要加 = 1?不加不行嗎?
CASE ... END 的結果類型取決於 THEN/ELSE 返回值類型1 或 0,屬於 數值類型 (INT)CHECK (condition) 中的 condition 必須是**布林表達式**CASE ... END 本身是數值表達式 → 報錯:An expression of non-boolean type specified in a context where a condition is expected= 1 將其轉為**比較表達式** → 結果為布林值 → 合法-- 邏輯等價:sex != '2' OR salary > 1000
ALTER TABLE Salary
ADD CONSTRAINT check_salary CHECK (
sex <> '2' OR salary > 1000
);
-- PostgreSQL、SQL Server (部分版本) 支援
ALTER TABLE Salary
ADD CONSTRAINT check_salary CHECK (
CASE WHEN sex = '2' THEN salary > 1000 ELSE TRUE END
);
ALTER TABLE Salary
ADD CONSTRAINT check_salary CHECK (
CASE WHEN sex = '2' THEN CASE WHEN salary > 1000 THEN 1 ELSE 0 END
ELSE 1 END = 1
);
該約束含義:「若性別為 '2'(女),則薪資必須大於 1000;其他性別不限制」
sex = '2' AND salary <= 1000 → 返回 0 → 0 = 1 為 FALSE → **違反約束**1 = 1 為 TRUE → **滿足約束**CHECK (sex <> '2' OR salary > 1000) 簡潔、效率高、可讀性強CHECK 後必須跟**布林表達式**,數值表達式需透過比較運算子(=, <>, > 等)轉換總結:= 1 不是多餘,而是將數值結果強制轉為布林值以滿足 CHECK 約束的語法要求。理解「表達式類型」與「上下文期望類型」的匹配關係,是寫出正確 SQL 約束的關鍵。