準備報表輸入
本例只取兩個可缺輸入中已有記錄的最高值,不推定未見資料最高。SQLite 多參數 max 只要有 NULL 便回 NULL,須明列缺值分支,兩者皆無仍 NULL。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 編號 | 輸入 a | 輸入 b |
|---|---|---|
| A | 5 | NULL(未知或沒有) |
| B | 2 | 8 |
| C | NULL(未知或沒有) | NULL(未知或沒有) |
CREATE TABLE readings(id TEXT PRIMARY KEY,a INTEGER,b INTEGER); INSERT INTO readings VALUES('A',5,NULL),('B',2,8),('C',NULL,NULL);比較錯誤及更正結果
SELECT id,max(a,b) AS known_max FROM readings ORDER BY id;| 編號 | 已記最高值 |
|---|---|
| A | NULL(未知或沒有) |
| B | 8 |
| C | NULL(未知或沒有) |
SELECT id,CASE WHEN a IS NULL THEN b WHEN b IS NULL THEN a ELSE max(a,b) END AS known_max FROM readings ORDER BY id;| 編號 | 已記最高值 |
|---|---|
| A | 5 |
| B | 8 |
| C | NULL(未知或沒有) |
A 有五、b 未有,應顯示五;B 八、C 未知。缺值不能一律補零,已有讀數可為負。
用新副本測邊界
A 唯一已知讀數改負二,仍顯負二,不是零或 NULL。
另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。
UPDATE readings SET a=-2 WHERE id='A';
SELECT id,CASE WHEN a IS NULL THEN b WHEN b IS NULL THEN a ELSE max(a,b) END AS known_max FROM readings ORDER BY id;| 編號 | 已記最高值 |
|---|---|
| A | -2 |
| B | 8 |
| C | NULL(未知或沒有) |
邊界改動後 A 已記最高值是多少?
查看參考答案
負二,沒有第二讀數,結果只描述已有輸入。