Seven_cm 2014-12-27 15:20 采纳率: 100%
浏览 5824
已采纳

mysql中case条件中case when 1 then xxx 与 case when a>0的结果不一样的疑惑

详细描述如:http://blog.csdn.net/seven_cm/article/details/41527505
结果集只有1和0,为什么结果是不一样的?

  • 写回答

6条回答 默认 最新

  • ACMAIN_CHM 2014-12-28 11:47
    关注
     楼主的误区是在  case status when status>0 then 1 else 0 end 上,正规的写法是 case status when 0 then 1 else 0 end 注意这里是没有 status>0的。
    
    需要注意和区分CASE的两种语法的不同。
    CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END 
    CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END 
    
    当使用了CASE value这种格式,则MYSQL会对 value 与后面的每个 compare_value 进行比较。
    而楼主在语句中正是使用的 CASE value这种格式
    
    所以当 case status when status>0 then 1 else 0 end 时,要意识到 when status>0  这里不是条件,是值。举例来说。比如第一条记录
    +-----+-----+--------+
    | uid | tid | status |
    +-----+-----+--------+
    |   1 |   1 |      0 |
    
    这条件中 status=0 则 case status when status>0 then 1 else 0 end 
    被处理为 case 0 when 0>0 then 1 else 0 end, 
    而0>0 逻辑运算的结果是 false 为 0 ,
    所以语句为 case 0 when 0 then 1 else 0 end 
    这样运算的结果为 1
    
    
    其实看一下这个结果应该会更容易理解问题出在哪儿了。
    
    mysql> select tid,status,status>0 v1,status>=0 v2,
        ->  case status when status>0 then 1 else 0 end as c1,
        ->  case status when status>=0 then 1 else 0 end as c2
        -> from case_test;
    +-----+--------+------+------+------+------+
    | tid | status | v1   | v2   | c1   | c2   |
    +-----+--------+------+------+------+------+
    |   1 |      0 |    0 |    1 |    1 |    0 |
    |   2 |      0 |    0 |    1 |    1 |    0 |
    |   3 |      0 |    0 |    1 |    1 |    0 |
    |   4 |      0 |    0 |    1 |    1 |    0 |
    |   5 |      0 |    0 |    1 |    1 |    0 |
    |   6 |      0 |    0 |    1 |    1 |    0 |
    |   7 |      0 |    0 |    1 |    1 |    0 |
    |   8 |      0 |    0 |    1 |    1 |    0 |
    |   9 |      0 |    0 |    1 |    1 |    0 |
    |  10 |      0 |    0 |    1 |    1 |    0 |
    |  11 |      1 |    1 |    1 |    1 |    1 |
    |  12 |      1 |    1 |    1 |    1 |    1 |
    |  13 |      1 |    1 |    1 |    1 |    1 |
    |  14 |      1 |    1 |    1 |    1 |    1 |
    |  15 |      1 |    1 |    1 |    1 |    1 |
    |  16 |      1 |    1 |    1 |    1 |    1 |
    |  17 |      1 |    1 |    1 |    1 |    1 |
    |  18 |      1 |    1 |    1 |    1 |    1 |
    |  19 |      1 |    1 |    1 |    1 |    1 |
    |  20 |      1 |    1 |    1 |    1 |    1 |
    +-----+--------+------+------+------+------+
    20 rows in set (0.02 sec)
    
    mysql>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型