2015-07-01 75 views
0

我有一個存儲過程,我查詢一段時間間隔的數據。所以我寫了下面的查詢在存儲過程中執行:如果查詢沒有數據,那麼獲取默認值?

SET @quer = CONCAT('INSERT INTO tmp (`time_interval`, `cnt`, `dat`, `txn_id`) (SELECT DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\') as time_interval , COUNT(v.id) as cnt 
    , date(v.timestamp) as dat, \"', _txn_id, '\" as txn_id FROM vehicle v WHERE v.timestamp BETWEEN \'', tmpStart, '\' 
         AND \'', tmpEnd, '\' ', _where_clause, ' GROUP BY time_interval)') 

但問題,我想它對於其中有沒有值的時間間隔插入0。

Actual : for 01:00 - 02:00 = 12 
     for 03:00 - 04:00 = 10 
Expected:for 01:00 - 02:00 = 12 
     for 02:00 - 03:00 = 0 
     for 03:00 - 04:00 = 10 

請任何人都可以建議如何更改查詢以獲得此結果。

謝謝。

回答

0

嘗試使用COALESCE函數,如果欄爲空,則合併功能把你的價值爲默認值,下面的例子:

SELECT id, ..., coalesce(columnWithNulls, DefaultValue) FROM ... 
+0

我編輯過這樣:COALESCE(COUNT(v.id),0)as cnt,但它仍然是一樣的。我做錯了嗎? – GuruKulki

+0

這很奇怪。合併應該像魅力一樣工作。你的選擇查詢返回什麼結果?我對cnt專欄特別感興趣。您也可以嘗試大小寫語法。 (不是無效的計數會返回)然後0作爲cnt ...(012. v.id)結束)' – Dapter20

0

嘗試使用IFNULL函數

SELECT IFNULL(DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\'),'0') as time_interval

+0

'不,它不工作。我想將cnt設置爲0,沒有任何價值。 – GuruKulki

+0

不是從選擇查詢的結果集中插入,而是可以將所有time_interval和date一次性插入到表tmp中。 然後,您可以使用帶有IFNULL的更新查詢(colwithnull,'默認值')。 對於如 '插入tmp目錄('time_interval','dat')值('01:00 - 02:00' , '2015年7月1日')' 後來 '更新TMP組'time_interval' =(SELECT IFNULL(DATE_FORMAT(\'',tmpStart,'\',\'%H:%i'),'0')))' – Manii

0

我得到了我回答使用此查詢。 Union ALL的默認值爲0.

SET @quer = CONCAT('INSERT INTO tmp (`time_interval`, `cnt`, `dat`, `txn_id`) Select * FROM (SELECT DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\') as time_interval , COUNT(v.id) as cnt 
, date(v.timestamp) as dat, \"', _txn_id, '\" as txn_id FROM vehicle v WHERE v.timestamp BETWEEN \'', tmpStart, '\' 
        AND \'', tmpEnd, '\' ', _where_clause, ' GROUP BY time_interval UNION ALL SELECT DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\') as time_interval , 0 as cnt 
, date(\'', tmpStart, '\') as dat, \"', _txn_id, '\" as txn_id) AS A GROUP BY A.time_interval'); 
相關問題