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应用程序来处理这个问题。