準備報表輸入
本例只要主值已有記錄,包括零,便優先用;主值 NULL 才轉後備。NULLIF(primary_value,0) 先把零變 NULL,破壞此分別。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 編號 | 主讀數 | 後備讀數 |
|---|---|---|
| A | 0 | 8 |
| B | NULL(未知或沒有) | 5 |
| C | 3 | 9 |
CREATE TABLE readings(id TEXT PRIMARY KEY,primary_value INTEGER,backup_value INTEGER); INSERT INTO readings VALUES('A',0,8),('B',NULL,5),('C',3,9);比較錯誤及更正結果
SELECT id,COALESCE(NULLIF(primary_value,0),backup_value) AS selected_value FROM readings ORDER BY id;| 編號 | 所選值 |
|---|---|
| A | 8 |
| B | 5 |
| C | 3 |
SELECT id,COALESCE(primary_value,backup_value) AS selected_value FROM readings ORDER BY id;| 編號 | 所選值 |
|---|---|
| A | 0 |
| B | 5 |
| C | 3 |
A 應留零,錯誤卻用八。B 主值未知,所以合理用五;C 留三。
用新副本測邊界
加兩值都是 NULL 的 D,結果仍 NULL,不編零。
另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。
INSERT INTO readings VALUES('D',NULL,NULL);
SELECT id,COALESCE(primary_value,backup_value) AS selected_value FROM readings ORDER BY id;| 編號 | 所選值 |
|---|---|
| A | 0 |
| B | 5 |
| C | 3 |
| D | NULL(未知或沒有) |
更正後 A 用哪值?
查看參考答案
零,主讀數已記,毋須後備八;D 兩者皆無則仍未知。