2012-10-29 4 views
2

IF 조건에 따라 where 절을 변경하려고합니다. 어떤 이유로 쿼리가 실패합니다. 나는 어떤 도움을 주셔서 감사합니다.If-else else where 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

"어떤 이유"는 거의 항상 충분하지 않습니다 ;-) * 정확한 * 오류 메시지 또는 문제는 무엇입니까? –

답변

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 < ?, 
     ue.timestart > 0 AND ue.timestart + ue.timextension < ? 
      OR ue.timecreated > 0 AND ue.timecreated + ue.timeextension < ?); 
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)) < ?) 
+0

제 2의 사람은 일했다.. 많이 제정되었다! !! – user1783854

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 < ?) 
    ) 

AND    
    (
     (ue.timestart > 0 AND ue.timestart + 
      IFNULL(ue.timeextension , cr.enrolperiod) < ?) 
    OR (ue.timecreated > 0 AND ue.timecreated + 
      IFNULL (ue.timeextension, cr.enrolperiod) < ?) 
    )