金額表Money
| 流水號 | 時限(Deadline) | 等級(Level) | 金額一(One) | 金額二(Two) | 金額三(Three) |
| 1 | 2017/12/31 | 10000 | 50 | 100 | 150 |
| 2 | 2017/12/31 | 20000 | 100 | 200 | 300 |
| 3 | 2017/12/31 | 30000 | 150 | 300 | 450 |
| 4 | NULL | 10000 | 100 | 200 | 300 |
| 5 | NULL | 20000 | 200 | 400 | 600 |
| 6 | NULL | 30000 | 300 | 600 | 900 |
| 7 | NULL | 40000 | 400 | 800 | 1200 |
查詢同時符合以下條件
(1) 日期2017/12/19,查詢結果為→時限2017/12/31的資料。
(2) 日期2018/01/01,查詢結果為→時限為NULL的資料。
Try 1
測試2017-12-19查詢,用OR無法得到想要的結果。
-- MySQL
SELECT * FROM Money
WHERE (Deadline >= '2017-12-19' OR Deadline IS NULL)
GROUP BY Level
結果會讓流水號7也跑出來| 流水號 | 時限(Deadline) | 等級(Level) | 金額一(One) | 金額二(Two) | 金額三(Three) |
| 1 | 2017/12/31 | 10000 | 50 | 100 | 150 |
| 2 | 2017/12/31 | 20000 | 100 | 200 | 300 |
| 3 | 2017/12/31 | 30000 | 150 | 300 | 450 |
| 7 | NULL | 40000 | 400 | 800 | 1200 |
Try 2,在WHERE裡使用IF和子查詢
測試2017-12-19查詢
-- MySQL 測試2017-12-19查詢
SELECT * FROM Money
WHERE IF( (SELECT sub_m.Deadline FROM Money AS sub_m WHERE sub_m.Deadline>='2017-12-19' LIMIT 1) IS NULL,
Deadline IS NULL,
Deadline>='2017-12-19')
ORDER BY Level ASC
結果:| 流水號 | 時限 | 等級 | 金額一 | 金額二 | 金額三 |
| 1 | 2017/12/31 | 10000 | 50 | 100 | 150 |
| 2 | 2017/12/31 | 20000 | 100 | 200 | 300 |
| 3 | 2017/12/31 | 30000 | 150 | 300 | 450 |
測試2018-01-01查詢
-- MySQL 測試2018-01-01查詢
SELECT * FROM Money
WHERE IF( (SELECT sub_m.Deadline FROM Money AS sub_m WHERE sub_m.Deadline>='2018-01-01' LIMIT 1) IS NULL,
Deadline IS NULL,
Deadline>='2018-01-01')
ORDER BY Level ASC
結果:| 流水號 | 時限 | 等級 | 金額一 | 金額二 | 金額三 |
| 4 | NULL | 10000 | 100 | 200 | 300 |
| 5 | NULL | 20000 | 200 | 400 | 600 |
| 6 | NULL | 30000 | 300 | 600 | 900 |
| 7 | NULL | 40000 | 400 | 800 | 1200 |
沒有留言:
張貼留言