SQLite Min函数在使用String数据的行中返回NULL

时间:2016-11-11 08:01:44

标签: sql sqlite

尽管在我发现它的每个地方,如果一行是空的,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应用程序。

1 个答案:

答案 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');