MySQL 中的案例函数



为什么这不起作用?我想显示一个新列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`;

查看演示

实际上,您的查询中有拼写错误...您放错了所有括号,例如:

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

应该是:

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

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

  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;

在 CASE 的每个 WHEN 行中,您的代码中都有一个逻辑错误。例如,如果birth_date 1982-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

最新更新