mysql - 无法让 CASE 为 NULL 替换工作。

标签 mysql sql

我的代码示例如下:

我想查找已经开始并且可能有也可能没有结束日期的契约(Contract)。如果结束日期晚于今天,或者尚未指定(NULL/空),那就太好了。

SELECT 
   ID, BeginDate, EndDate,
CASE
   WHEN EndDate IS NULL 
    THEN curdate()+1
END as FinishDate
FROM 
    contracts
WHERE 
    (id=1) AND
    (CURDATE() BETWEEN BeginDate and FinishDate);

但是我得到了

#1054 - Unknown column 'FinishDate' in 'where clause

我错过了什么?

最佳答案

这是因为FinishDate不是原表的列,所以其标识符的作用域仅限于ORDER BY子句;它不能在 WHERE 子句中使用。

有多种方法可以解决此问题。最简单的一种是将表达式复制到 WHERE 子句中:

SELECT 
   ID, BeginDate, EndDate,
CASE
   WHEN EndDate IS NULL 
    THEN curdate()+1
END as FinishDate
FROM 
    contracts
WHERE 
    (id=1) AND
    (CURDATE() BETWEEN (CASE WHEN EndDate IS NULL THEN curdate()+1 END) and FinishDate);

注意:大多数 RDBMS 都有一个特殊的运算符来提供空替换表达式。在 COALESCEISNULL 的 MS SQL Server 中:

SELECT 
   ID, BeginDate, EndDate,
   ISNULL(EndDate, curdate()+1) as FinishDate
FROM 
    contracts
WHERE 
    (id=1) AND
    (CURDATE() BETWEEN ISNULL(EndDate, curdate()+1) and FinishDate);

关于mysql - 无法让 CASE 为 NULL 替换工作。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22113796/

相关文章:

sql - 检查值是否为日期并将其转换

sql - 在哪里可以练习SQL?

mysql - 插入另一个表时比较两个不同表中的值 'middle table'

mysql - ActiveRecord 请求过多

mysql - 想要来自 ireport 交叉表的两个单独类别行的报告

mysql - 排序后返回 Asc 增量 MYSQL

sql 合并可能具有空值的两列

sql - 从两个字段中选择第一个不同的值

mysql - 升级Wordpress后数据库连接错误

sql - Oracle SQL 查询 : Getting Largest Sale for Employee