尽管在我发现它的每个地方,如果一行是空的,MIN()
只会返回NULL
,但对于我来说它是不同的。
我有下表:
+---+------------+------------+------------+
| | column1 | column2 | column3 |
+---+------------+------------+------------+
| 3 | 2016-11-01 | 2016-11-02 | 2016-10-27 |
| 4 | NULL | NULL | 2016-10-28 |
| 5 | 2013-12-12 | 2016-11-02 | 2016-10-30 |
+---+------------+------------+------------+
尝试使用
获取每行的最小值SELECT MIN(column1, column2, column3) FROM myTable
使用
进行比较WHERE STRFTIME('%Y-%m-%d', MIN(column1, column2, column3)) BETWEEN DATE('2000-01-01') and DATE('2016-11-10');
但是第一行返回以下输出:
+-------------------------------+
| MIN(column1, column2, column3 |
+-------------------------------+
| 2016-10-27 |
| NULL |
| 2013-12-12 |
+-------------------------------+
结果WHERE
语句不包含该行。
我所希望的:
+-------------------------------+
| MIN(column1, column2, column3 |
+-------------------------------+
| 2016-10-27 |
| 2016-10-28 |
| 2013-12-12 |
+-------------------------------+
如何将语句更改为不包含NULL
单元格或更改表格才能正常工作?
编辑:永远不会是一个完全空行!此表连接到将负责此操作的Java应用程序。
答案 0 :(得分:2)
这个答案并不好,我怀疑可能有更好的方法。但是,一个选项是在每个日期列上使用IFNULL
,并在值为NULL
的情况下替换为非常高的日期值:
SELECT MIN(IFNULL(column1, '9999-01-01'),
IFNULL(column2, '9999-01-01'),
IFNULL(column3, '9999-01-01'))
FROM myTable
WHERE STRFTIME('%Y-%m-%d', MIN(IFNULL(column1, '9999-01-01'),
IFNULL(column2, '9999-01-01'),
IFNULL(column3, '9999-01-01')))
BETWEEN DATE('2000-01-01') AND DATE('2016-11-10');