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条)

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 虚心请教几个问题,小生先有礼了
  • ¥30 截图中的mathematics程序转换成matlab