sql语句中case-when用法

今天有个朋友问我这样一个问题,如下图,为什么1和2颠倒了,从而引出了sql中的case-when语句。


问题是这个地方为什么Activety是2,Controller是1,按照正常逻辑应该是Activety是1,Controller是2。

后来发现是sql语法有错了,应该写成如下样子:



case关键字后面不应该跟变量~那么问题来了,case语法到底是什么样的?

其实case语法有两种格式:

SELECT NAME AS NAME,CASE category 
WHEN 'tech' THEN 'gaga'
WHEN 'words' THEN 'prince'
FROM daily
SELECT NAME AS NAME,CASE 
WHEN category ='tech' THEN 'gaga'
WHEN category ='words' THEN 'prince'
FROM daily

两种方式效果相同,但是第二种方式可以做更复杂的逻辑,上文中问题在于把这两种方式写在了一起,但是问题是,写在一起语法竟然是没错的,那么最后会按照那种语法来执行呢?研究之后发现是第一语法来执行。而此时when关键字后面的值要么是true要么是false,最后sql的语义变成了case后变量和true和false比较。比较奇怪的是在mysql中,一个字符串和false比返回是真,而与true比较返回是假。这个大家可以自己去做下实验。

SELECT bigcate  FROM daily a WHERE a.bigcate=(FALSE) LIMIT 100;
类似于上面的写法返回的是全集

SELECT bigcate  FROM daily a WHERE a.bigcate=(TRUE) LIMIT 100;

上面的写法返回的是空集。

然后再回到最开始的sql去分析下,很自然就清楚结果是怎么来的了。

转载请注明出处:http://gagalulu.wang/blog/detail/17 您的支持是我最大的动力!







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值