2016-11-11 60 views
3

儘管在每個地方我發現它讀取MIN()只會返回NULL如果一行是空的,對我來說它是不同的。
我有如下表: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應用程序。

回答

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'); 
+0

這個偉大的工程!這實際上可以解決我的問題......我可以將默認值設置爲這個較高的日期並創建具有該值的行。你說的;它不是很乾淨,但除非沒有其他解決方案,我會採取的!謝謝。不過,我會等一下,看看是否會有其他答案:) – geisterfurz007

+1

@ geisterfurz007是的,請稍等片刻。另外請注意,如果缺少所有三個值,我的解決方案就不那麼好了。在這種情況下,你會得到'9999-01-01'作爲最小日期,這是錯誤的(它應該是NULL)。你可以用'CASE'表達式將整個調用包裝到'MIN'中,該表達式檢查'9999-01-01',但現在這真的會變得很難看。 –

+0

永遠不會有一個完全空的行。我忘了在問題中提到這一點。將有一個Java應用程序處理這個問題。 – geisterfurz007