SQLite Min函数在包含字符串数据的行中返回NULL

SQLite Min函数在包含字符串数据的行中返回NULL,sql,sqlite,Sql,Sqlite,即使在我发现的每个地方,如果一行是空的,它都读MIN()只会返回NULL,但对我来说它是不同的。 我有下表: +---+------------+------------+------------+ | | column1 | column2 | column3 | +---+------------+------------+------------+ | 3 | 2016-11-01 | 2016-11-02 | 2016-10-27 | | 4 | NULL

即使在我发现的每个地方,如果一行是空的,它都读
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应用程序,该应用程序将处理此问题。

这个答案不太好,我怀疑可能有更好的方法。但一种选择是在每个日期列上使用
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');

这太棒了!这实际上可以解决我的问题。。。我可以将默认值设置为这个高日期,并使用该值创建行。你说对了;它不是很干净,但除非没有其他解决方案,否则我会接受它!已经谢谢你了。不过,我会稍等,看看是否还有其他答案:)@geisterfurz007是的,请稍等。还要注意的是,如果三个值都丢失了,我的解决方案就不是那么好了。在这种情况下,您将获得
9999-01-01
作为最小日期,这是错误的(它应该是
NULL
)。您可以将对
MIN
的整个调用封装在一个
CASE
表达式中,该表达式检查
9999-01-01
,但现在这将变得非常糟糕。永远不会有一个完全空的行。我忘了在问题中提到那一点。将会有一个Java应用程序来处理这个问题。