今天有个朋友问我这样一个问题,如下图,为什么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 您的支持是我最大的动力!