sql语句中case-when用法

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

sql语句中case-when用法_第1张图片

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

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

sql语句中case-when用法_第2张图片


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 您的支持是我最大的动力!







你可能感兴趣的:(后端)