跳至內容
Astera Technology

max(a,b) 為何因另一值 NULL 而藏掉已有讀數?

先處理可缺輸入,再取已有記錄最高值。

下載完整個案資料及參考答案 ↓

準備報表輸入

本例只取兩個可缺輸入中已有記錄的最高值,不推定未見資料最高。SQLite 多參數 max 只要有 NULL 便回 NULL,須明列缺值分支,兩者皆無仍 NULL。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:readings
編號輸入 a輸入 b
A5NULL(未知或沒有)
B28
CNULL(未知或沒有)NULL(未知或沒有)
下載可編輯 CSV ↓
完整建表及插入假設資料
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:重現問題
SELECT id,max(a,b) AS known_max FROM readings ORDER BY id;
錯誤查詢的逐行結果
編號已記最高值
ANULL(未知或沒有)
B8
CNULL(未知或沒有)
下載可編輯 CSV ↓
更正 SELECT
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;
更正查詢的逐行結果
編號已記最高值
A5
B8
CNULL(未知或沒有)
下載可編輯 CSV ↓

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
B8
CNULL(未知或沒有)
下載可編輯 CSV ↓

邊界改動後 A 已記最高值是多少?

查看參考答案

負二,沒有第二讀數,結果只描述已有輸入。

相關資源