关于COALESCE语法的MySQL条件

时间:2011-10-10 11:26:31

标签: mysql coalesce

我有一个由COALESCE语法组成的查询。 COALESCE语法只查找文件的审核日期。在我的WHERE语句中,我只想从AuditDate别名字段输出审计文件库,但我不起作用。这是我的询问。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

任何人都可以帮助我如何正确地查询此查询?

4 个答案:

答案 0 :(得分:3)

您的查询必须像这样

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE COALESCE(qua.starttime, prd.starttime) BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

根据您的情况,您不能使用来自函数结果的别名作为WHERE子句中的查询条件(请参阅http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html)。但您可以使用别名在HAVING子句中搜索,如MySQL 5.0.2和up允许HAVING子句引用SELECT列表或外部子查询中的select_expr中指定的任何列或别名,和聚合函数,如

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 HAVING `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

两者都有相同的结果

答案 1 :(得分:2)

使用

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE COALESCE(qua.starttime, prd.starttime) BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

以上假设您的日期格式/列类型确实匹配...

答案 2 :(得分:2)

您不能像别人指出的那样使用别名。为避免调用coalesce两次,可以使用HAVING语句。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
HAVING `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

答案 3 :(得分:1)

您无法使用SELECT子句中WHERE列表中的别名。

使用此:

SELECT *
FROM
  ( SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
           prd.employeeno AS `EmployeeNo`,
           prd.starttime AS `StartTime`,
           prd.endtime AS `EndTime`
      FROM production prd
      LEFT JOIN qualityaudit qua
        ON prd.id=qua.id
  ) AS tmp
WHERE `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

或复制代码:

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE COALESCE(qua.starttime, prd.starttime) 
         BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';