2

我正在尝试根据 IF 条件更改 where 子句。查询由于某种原因失败。我将不胜感激任何帮助。

谢谢!

        SELECT
            c.id AS course,
            cr.id AS criteriaid,
            u.id AS userid,
            ue.timestart AS otimestart,
            (ue.timestart + cr.enrolperiod) AS ctimestart,
            ue.timecreated AS otimeenrolled,
            (ue.timecreated + cr.enrolperiod) AS ctimeenrolled
        FROM
            {user} u
        INNER JOIN
            {user_enrolments} ue
         ON ue.userid = u.id
        INNER JOIN
            {enrol} e
         ON e.id = ue.enrolid
        INNER JOIN
            {course} c
         ON c.id = e.courseid
        INNER JOIN
            {course_completion_criteria} cr
         ON c.id = cr.course
        LEFT JOIN
            {course_completion_crit_compl} cc
         ON cc.criteriaid = cr.id
        AND cc.userid = u.id
        WHERE
            cr.criteriatype = 5
        AND c.enablecompletion = 1
        AND cc.id IS NULL
        AND             
        (
        IF (ue.timeextension IS NULL)
                (ue.timestart > 0 AND ue.timestart + cr.enrolperiod < ?
          OR ue.timecreated > 0 AND ue.timecreated + cr.enrolperiod < ?)
        ELSE 
                (ue.timestart > 0 AND ue.timestart + ue.timextension < ?
          OR ue.timecreated > 0 AND ue.timecreated + ue.timeextension < ?)
        ) 
4

3 回答 3

2

IF表达式的语法是:

IF(<cond-expr>, <then-expr>, <else-expr>)

语法中没有ELSE关键字,您只需用逗号分隔两个结果表达式。所以你的表达式的正确语法应该是:

AND IF(ue.timeextension IS NULL,
       (ue.timestart > 0 AND ue.timestart + cr.enrolperiod < ?)
         OR (ue.timecreated > 0 AND ue.timecreated + cr.enrolperiod < ?),
       (ue.timestart > 0 AND ue.timestart + ue.timextension < ?)
         OR (ue.timecreated > 0 AND ue.timecreated + ue.timeextension < ?))

你可以这样写的另一种方式是:

AND ((ue.timestart > 0 AND ue.timestart + IFNULL(ue.timeextesion, cr.enrolperiod) < ?)
     OR (ue.timecreated > 0 AND ue.timecreated + IFNULL(ue.timeextesion, cr.enrolperiod)) < ?)
于 2012-10-29T19:37:32.247 回答
0

根据您要完成的任务,正确的 where 子句可能是:

...
where ...
and (if(ue.timeextension IS NULL,
        ue.timestart > 0 AND ue.timestart + cr.enrolperiod < ?
            OR ue.timecreated > 0 AND ue.timecreated + cr.enrolperiod < ?,
        ue.timestart > 0 AND ue.timestart + ue.timextension < ?
            OR ue.timecreated > 0 AND ue.timecreated + ue.timeextension < ?);
于 2012-10-29T19:35:57.310 回答
0

我想你可以试试 where 的最后一部分,即

   AND             
    (
    IF (ue.timeextension IS NULL)
            (ue.timestart > 0 AND ue.timestart + cr.enrolperiod < ?
      OR ue.timecreated > 0 AND ue.timecreated + cr.enrolperiod < ?)
    ELSE 
            (ue.timestart > 0 AND ue.timestart + ue.timextension < ?
      OR ue.timecreated > 0 AND ue.timecreated + ue.timeextension < ?)
    ) 

作为

   AND             
    (
      (ue.timestart > 0 AND ue.timestart + 
             IFNULL(ue.timeextension , cr.enrolperiod )  < ? )
     OR (ue.timecreated > 0 AND ue.timecreated + 
             IFNULL (ue.timeextension, cr.enrolperiod) < ? )
    ) 
于 2012-10-29T19:38:55.860 回答