【问题标题】:CASE WHEN does not return expected valueCASE WHEN 不返回预期值
【发布时间】:2014-02-28 15:20:05
【问题描述】:

我有一个表格,其中有一列包含出生日期 (bdate) 和较晚的日期 (entry)。 当一个人的年龄低于 35 岁时,我想要一个 2 的值 当年龄 >= 36 且

但是,我的查询永远不会返回高于 3 的值。出了什么问题?

SELECT TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ) , '%Y %m %d' ) , entry),
CASE
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 35 THEN 2
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 36 <= 40 THEN 3
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 41 <= 45 THEN 4
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 46 <= 50 THEN 5
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 51 <= 55 THEN 6
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 56 <= 60 THEN 7
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 61 <= 65 THEN 8
ELSE 0
END AS value
FROM mytable

【问题讨论】:

  • &gt;= 36 &lt;= 40 条件测试有错误......应该像a &gt;= 36 AND a &lt;= 40

标签: mysql


【解决方案1】:

您需要区分不等式。这是一个例子:

SELECT @a := TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ) , '%Y %m %d' ) , entry),
CASE
    WHEN @a <= 35 THEN 2
    WHEN @a >= 36 and @a <= 40 THEN 3
    WHEN @a >= 41 and @a <= 45 THEN 4
    WHEN @a >= 46 and @a <= 50 THEN 5
    WHEN @a >= 51 and @a <= 55 THEN 6
    WHEN @a >= 56 and @a <= 60 THEN 7
    WHEN @a >= 61 and @a <= 65 THEN 8
    ELSE 0
END AS value
FROM mytable

使用临时变量 (@a) 的这个小技巧可以为您节省大量打字工作(并使事情更清晰)。

希望对你有帮助

【讨论】:

  • 您的解决方案真是太棒了。起初在我的复制粘贴过程中出了点问题,但在修复之后,它变得非常好。感谢您让我看到临时变量。
  • @Vercingetorix 我很乐意为您提供帮助。临时变量是 MySQL 隐藏的瑰宝之一……如果您细心且富有创造力,它们可以为您做惊人的事情(我经常使用它们来计算“运行总计”和“移动平均线”;看看 @987654321 @)
【解决方案2】:

去掉大于部分:

SELECT TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ) , '%Y %m %d' ) , entry),
CASE
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 35 THEN 
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 40 THEN 
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 45 THEN 
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 50 THEN 
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 55 THEN 
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 60 THEN 
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 65 THEN 
ELSE 0
END AS value
FROM mytable

它正在查看&gt;= 36 并将其评估为真。您不能像 &gt;= 36 &lt;= 40 那样简单地连接。

【讨论】:

    【解决方案3】:

    存在语法错误。

    与两个值进行比较是错误的。

    WHEN TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ), '%Y %m %d' ), entry )
           >= 36 <= 40 THEN 3
    

    使用between 子句比较范围内的值。

    WHEN TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ), '%Y %m %d' ), entry )
         BETWEEN 36 AND 40 THEN 3
    

    在其他此类比较中应用相同的内容。

    【讨论】:

      【解决方案4】:

      只是减去值

      SELECT
      CASE
      WHEN bdate - entry <= 35 THEN 2
      WHEN bdate - entry between 36 and 40 THEN 3
      WHEN bdate - entry between 41 and 45 THEN 4
      WHEN bdate - entry between 46 and 50 THEN 5
      WHEN bdate - entry between 51 and 55 THEN 6
      WHEN bdate - entry between 56 and 60 THEN 7
      WHEN bdate - entry between 61 and 65 THEN 8
      ELSE 0
      END AS value
      FROM mytable
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 2013-03-22
        • 2012-02-04
        • 2012-02-04
        • 1970-01-01
        相关资源
        最近更新 更多