MySQL中的案例函数

时间:2019-02-06 11:38:38

标签: mysql sql case

为什么这不起作用?我想显示一个新列seasons,其中包含每个学生的生日正确的季节。

CREATE TABLE `students` (
  `student_id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  `surname` varchar(45) DEFAULT NULL,
  `birth_date` date DEFAULT NULL,
  PRIMARY KEY (`student_id`)
);

查询:

SELECT *, CASE
    WHEN (1 <= MONTH(`birth_date`))
     AND (MONTH(`birth_date` <= 3)) THEN 'winter'
    WHEN (MONTH(`birth_date` <= 6)) THEN 'spring'
    WHEN (MONTH(`birth_date` <= 9)) THEN 'summer'
    WHEN (MONTH(`birth_date` <= 12)) THEN 'autumn'
END AS `seasons`
FROM `students`;

请参阅demo

3 个答案:

答案 0 :(得分:2)

实际上,您的查询中有错别字...您将所有方括号放错了位置,例如这个:

WHEN (MONTH(`birth_date` <= 6)) THEN 

应该是:

WHEN (MONTH(`birth_date`) <= 6) THEN 

答案 1 :(得分:1)

您的查询不正确。您的条件不正确:

  1. 您必须使用(MONTH(birth_date) <= 12)而不是(MONTH(birth_date <= 12))
  2. 您使用“小于或等于”条件,例如MONTH(birth_date) <= 3,但是第三个月是春季,第六个月是夏季。

尝试以下查询

SELECT *,
  CASE 
  WHEN (MONTH(birth_date) BETWEEN 3 AND 5) THEN 'spring'
  WHEN (MONTH(birth_date) BETWEEN 6 AND 8) THEN 'summer'
  WHEN (MONTH(birth_date) BETWEEN 9 AND 11) THEN 'autumn'
  ELSE 'winter'
  END AS seasons
FROM students;

答案 2 :(得分:1)

在CASE的每个WHEN行中,代码中都有逻辑错误。例如,如果birth_date1982-04-01,则:

(MONTH(`birth_date` <= 6))

评估为

(MONTH(true))

因为您将方括号放在错误的位置-它会评估语句

`birth_date` <= 6

,然后将其结果传递给MONTH()函数。当然,MONTH(true)是荒谬的,并且返回NULL。内括号应仅在birth_date字段周围,因为这是您要获取月份的地方!

这是一个有效的版本:

SELECT *,
CASE 
  WHEN MONTH(`birth_date`) <= 3 THEN 'winter'
  WHEN MONTH(`birth_date`) <= 6 THEN 'spring'
  WHEN MONTH(`birth_date`) <= 9 THEN 'summer'
  WHEN MONTH(`birth_date`) <= 12 THEN 'autumn'
END AS `seasons`
FROM `students`;

(我看不到需要

(1 <= MONTH(`birth_date`))

顺便说一句,顺便说一下,所有外括号都是多余的。

这是一个工作示例,其中包含一些示例数据:https://www.db-fiddle.com/f/giQczqKvJNbdCJFwevJCk8/5