MySQL CASE WHEN的一个奇怪现象

2015-01-16 19:06 by Elliot

最近项目中遇到了一个很奇怪的问题, 我在创建数据库的时候, 用JDBC跑完数据库脚本后, 发现其中的一个存储过程总是不能正常执行. 但是同样数据库脚本如果直接用MySQL命令或者通过客户端执行的话就没问题. 起初我还以为是我的JDBC写的有问题, 但是我发现同时创建的6个存储过程中, 其它的几个都是可以正常执行的, 所以判定问题应该还是出在存储过程本身上.
再仔细检查存储过程后, 我注意到了其中有类似这样的语句:

INSERT INTO table_1 (cost)
SELECT SUM(CASE WHEN col1+col2>0 THEN col1+col2 END) AS 'cost';

这个SQL中的CASE WHEN语句是没有ELSE语句的, 因此如果col1+col2的值不大于0的话,则会在table_1表中插入cost字段为NULL的数据.而cost字段我有设置默认值为0,因此插入的数据的cost字段的值应该是0.
可是这样的语句却无法在table_1中插入数据.但是如果我把SQL改成:

INSERT INTO table_1 (cost)
SELECT SUM(CASE WHEN col1+col2>0 THEN col1+col2 ELSE 0 END) AS 'cost';

这样子就没问题, 可以在table_1表中插入数据了.

最奇怪的地方并不是加上了ELSE之后就能够向table_1表中插入数据, 而是第一条语句并不是一直不好用. 像我开头说的, 只有用JDBC创建存储过程的时候是不好用的, 如果用MySQL命令行工具或者客户端工具来创建这个存储过程的话, 这个存储过程就是可以正常执行, 并且可以向table_1中插入数据的.

这个问题目前依然困扰着我, 不知道出现这种现象的具体原因是什么.

本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 Elliot 并包含 原文链接
本文暂时还没有评论,你可以抢沙发哟。

发表评论