[SQL ] 使用CASE WHEN后order by被忽略?

楼主: jeamie (jeamie)   2015-11-20 21:02:53
(针对 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新手,也不知道有没有更好的方式来处理
如果前辈们知道更好的方式,还请您不吝赐教~~~
作者: bohei (run and fall)   2015-11-20 21:11:00
01-23 是指table没任何资料笔数的时候发生吗?
作者: kajm (kajm)   2015-11-20 22:02:00
应该是因为COUNT(*)是聚合函数的关系? 我试了两个方式可以成功,第一种是把COUNT(*)=0改成WHEN c_date IS NULL THEN 1第二种则是加上GROUP BY c_date即可 我也是新手不确定原因QQ抱歉,刚没注意到上述两种方式在没资料时也是有相同问题..改成这样应该就OK了~~ http://i.imgur.com/mog9upA.png
楼主: jeamie (jeamie)   2015-11-20 23:21:00
b大,01-23是指order by并没有按c_date排才会找到23点的有按条件排应该是00点的会在最上面k大谢谢,我再测试你的方法看看,另外我有试着在else加完整的select也是会正常显示,但觉得很怪…

Links booklink

Contact Us: admin [ a t ] ucptt.com