我在这个查询中有一点问题我的Q是如何检查where子句
中的状态SELECT `id`,`name`,`start_date`,`end_date`,
CASE
WHEN SYSDATE() < `start_date` THEN 'WAITING'
WHEN SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` THEN 'START'
WHEN SYSDATE() >= `end_date` THEN 'END'
END `status`
FROM teams WHERE `status` = 'START';
当我执行此查询时,它们会生成类似
的错误
参见数据库截图
非常感谢帮助
答案 0 :(得分:4)
问题是您无法在同一查询中按名称引用计算列。所以你需要使用内部子查询:
SELECT `id`,`name`,`start_date`,`end_date`, `status`
FROM (
SELECT `id`,`name`,`start_date`,`end_date`,
CASE
WHEN SYSDATE() < `start_date` THEN 'WAITING'
WHEN SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` THEN 'START'
WHEN SYSDATE() >= `end_date` THEN 'END'
END `status`
FROM teams) AS T
WHERE `status` = 'START';
或者您可以复制WHERE
子句中的逻辑,但大多数人不愿意这样做。另请注意,此解决方案允许您只需更改WHERE
子句以获取其他结果集:
WHERE status = 'WAITING'
WHERE status = 'END'
在设置这种方式后,你不必乱用逻辑。
答案 1 :(得分:2)
这不是同样的事情(我是SQL Server的小伙子,如果我遗漏某些内容或语法不是100%,请原谅我吗?)
SELECT `id`,`name`,`start_date`,`end_date`, 'START' AS `status`
FROM Teams
WHERE SYSDATE() >= `start_date` AND SYSDATE() <= `end_date`
答案 2 :(得分:1)
试试这个,你试图使用别名
列SELECT `id`,`name`,`start_date`,`end_date`,
CASE
WHEN SYSDATE() < `start_date` THEN 'WAITING'
WHEN SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` THEN 'START'
WHEN SYSDATE() >= `end_date` THEN 'END'
END `status`
FROM teams WHERE SYSDATE() between `start_date` and `end_date`;