作者jeamie (jeamie)
看板Database
标题[SQL ] 使用CASE WHEN後order by被忽略?
时间Fri Nov 20 21:02:53 2015
(针对
SQL 语言的问题,用这个标题。请用 Ctrl+Y 砍掉这行)
资料库名称:MySQL
资料库版本:5.6
内容/问题描述:
在写一个Hourly Event的store procedure
执行的内容就是会把table A每小时的资料运算後写到table B
但怕误执行所以想做个防止重覆写入的判断
却在这里遇到一个小问题
当table还未写入任何资料的时候
我的判断式就会有问题,以下是我的schema和SQL
table B
id m_n c_date
1 aa 2015-11-19 23:55:00
2 bb 2015-11-19 23:55:00
3 aa 2015-11-20 00:05:00
4 bb 2015-11-20 00:05:00
5 aa 2015-11-20 00:10:00
6 bb 2015-11-20 00:10:00
原本的条件是这样:
SELECT HOUR(NOW()) - HOUR(c_date) as c_d
FROM B
ORDER BY c_date DESC
LIMIT 1;
正常的情况下,若现在是2015-11-20 01:00:00
那我SELECT出来的值就会是 01-00=1
我用一个指标来接这个select出来的值
接着後面会进行if的判断式
如果是0就表示目前最近一个小时内已执行过
所以就会跳出这个store procedure
如果不是0就会继续做後面的动作
现在的问题是,当这个表第一次执行的时候会是空的
得到的值就不会是0,然後似乎在开启指标时就会有问题
因而造成这个Event就没有执行成功
我试着用以下这个方式来避免这个情况发生:
SELECT CASE WHEN COUNT(*)=0 THEN 1
ELSE HOUR(NOW()) - HOUR(create_time) END as c_d
FROM B
ORDER BY c_date DESC
LIMIT 1;
但这样一直变成 01-23=-22
为什麽不是我预想中的 01-00 呢?
为什麽它这样就不会照c_date做排序了吗?
有没有前辈知道原因为何??
我是store procedure新手,也不知道有没有更好的方式来处理
如果前辈们知道更好的方式,还请您不吝赐教~~~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.225.236.119
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.225.236.119
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1448024577.A.75E.html
※ 编辑: jeamie (36.225.236.119), 11/20/2015 21:05:23
※ 编辑: jeamie (36.225.236.119), 11/20/2015 21:05:50
※ 编辑: jeamie (36.225.236.119), 11/20/2015 21:07:35
※ 编辑: jeamie (36.225.236.119), 11/20/2015 21:09:20
1F:推 bohei: 01-23 是指table没任何资料笔数的时候发生吗? 11/20 21:11
2F:推 kajm: 应该是因为COUNT(*)是聚合函数的关系? 我试了两个方式可以 11/20 22:02
3F:→ kajm: 成功,第一种是把COUNT(*)=0改成WHEN c_date IS NULL THEN 1 11/20 22:03
4F:→ kajm: 第二种则是加上GROUP BY c_date即可 我也是新手不确定原因QQ 11/20 22:03
5F:→ kajm: 抱歉,刚没注意到上述两种方式在没资料时也是有相同问题.. 11/20 22:23
7F:→ jeamie: b大,01-23是指order by并没有按c_date排才会找到23点的 11/20 23:21
8F:→ jeamie: 有按条件排应该是00点的会在最上面 11/20 23:21
9F:→ jeamie: k大谢谢,我再测试你的方法看看,另外我有试着在else 11/20 23:22
10F:→ jeamie: 加完整的select也是会正常显示,但觉得很怪… 11/20 23:23