我的代码示例如下:
我想查找已经开始并且可能有也可能没有结束日期的契约(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 都有一个特殊的运算符来提供空替换表达式。在 COALESCE
和 ISNULL
的 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/