【问题标题】:Get default value if there is no data for the query?如果查询没有数据,则获取默认值?
【发布时间】:2015-07-01 09:26:59
【问题描述】:

我有一个存储过程,我在其中查询数据一段时间。所以我写了下面的查询在存储过程中执行:

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

请任何人建议我如何更改查询以获得此结果。

谢谢。

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:

    尝试使用 coalesce 函数,如果 column 为 null,则 coalesce 函数将您的值作为默认值,示例如下:

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

    【讨论】:

    • 我这样编辑:COALESCE(COUNT(v.id), 0) as cnt 但它仍然是一样的。我做错了吗?
    • 这很奇怪。 Coalesce 应该像魅力一样起作用。您的选择查询返回什么结果?我对cnt 专栏特别感兴趣。您也可以尝试大小写语法。 select (case COUNT(v.id) is null [OR WHATEVER INVALID COUNT WILL RETURN] THEN 0 ELSE COUNT(v.id) END) as cnt ...
    【解决方案2】:

    尝试使用 IFNULL 函数

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

    【讨论】:

    • 不,它不起作用。我想让 cnt 为 0 没有任何价值。
    • 您可以一次将所有时间间隔和日期插入到表 tmp 中,而不是从选择查询的结果集中插入。稍后您可以使用带有 IFNULL(colwithnull,'default value') 的更新查询。例如insert into tmp (time_interval, dat) values ('01:00 - 02:00','2015-07-01') 以及后来的update tmp set time_interval=(SELECT IFNULL(DATE_FORMAT(\'', tmpStart, '\', \'%H:%i\'),'0')))
    【解决方案3】:

    我使用这个查询得到了答案。将 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');
    

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2014-09-28
      • 2017-08-18
      相关资源
      最近更新 更多