我正在尝试根据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 < ?)
)
答案 0 :(得分: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)) < ?)
答案 1 :(得分: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 < ?);
答案 2 :(得分:0)
我想你可以尝试最后一节,即
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 < ?)
)
as
AND
(
(ue.timestart > 0 AND ue.timestart +
IFNULL(ue.timeextension , cr.enrolperiod ) < ? )
OR (ue.timecreated > 0 AND ue.timecreated +
IFNULL (ue.timeextension, cr.enrolperiod) < ? )
)