【问题标题】:How to use IF/CASE statement in stored procedure WHERE clause如何在存储过程 WHERE 子句中使用 IF/CASE 语句
【发布时间】:2017-08-18 07:09:35
【问题描述】:

我有这样的存储过程

DELIMITER $$

DROP PROCEDURE IF EXISTS `shashiTest`$$

CREATE DEFINER=`user`@`%` PROCEDURE `shashiTest`(IN GroupId INT, IN UserId INT, IN ChapterId INT)
BEGIN
    select 
    sum(qptdq.mark)-sum(qpe.marks) as marks_detucted,
    count(qpe.tc_question_message_type_id) AS noof_errors,
    (SELECT tqmt.key_value from tc_question_message_type tqmt WHERE tqmt.id=qpe.tc_question_message_type_id) AS error_type
    from question_paper qp
    INNER JOIN question_paper_group_student_map qpgsm ON qpgsm.question_paper_id=qp.id
    INNER JOIN institute_group_student_map igsm ON igsm.id=qpgsm.institute_group_student_map_id AND igsm.group_id=GroupId AND igsm.user_id=UserId
    INNER JOIN question_paper_template_detail qptd ON qptd.question_paper_template_id=qp.question_paper_template_id
    INNER JOIN question_paper_template_detail_question qptdq ON qptdq.question_paper_template_detail_id=qptd.id
    INNER JOIN question_paper_details qpd ON qpd.question_paper_template_detail_question_id=qptdq.id AND qpd.question_paper_id=qp.id
    INNER JOIN tc_question_mapping tcm ON tcm.tc_question_id=qpd.question_id
    INNER JOIN question_paper_evaluation qpe ON qpe.child_question_id=qptdq.id AND qpe.user_id=30 AND qpe.question_paper_id=qp.id AND qpe.tc_question_message_type_id IS NOT NULL
    INNER JOIN topic t ON t.cms_id=tcm.syllabus_chapter_details_id
    INNER JOIN chapter c ON c.id=t.chapter_id   
    IF (ChapterId IS NOT NULL)  THEN
        WHERE qp.question_paper_status_id >= 7 and c.id = ChapterId
    ELSE
        WHERE qp.question_paper_status_id >= 7
    END IF;
    GROUP BY qpe.tc_question_message_type_id LIMIT 5;
    END$$

DELIMITER ;

我想根据我的参数添加 where 条件,因为我有一个可选参数。 问题:我没有正确的语法。 我怎样才能做到这一点。请帮忙。谢谢。

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `shashiTest`$$
    
    CREATE PROCEDURE `shashiTest`(IN GroupId INT, IN UserId INT, IN ChapterId INT)
    BEGIN
        select 
        sum(qptdq.mark)-sum(qpe.marks) as marks_detucted,
        count(qpe.tc_question_message_type_id) AS noof_errors,
        (SELECT tqmt.key_value from tc_question_message_type tqmt WHERE tqmt.id=qpe.tc_question_message_type_id) AS error_type
        from question_paper qp
        INNER JOIN question_paper_group_student_map qpgsm ON qpgsm.question_paper_id=qp.id
        INNER JOIN institute_group_student_map igsm ON igsm.id=qpgsm.institute_group_student_map_id AND igsm.group_id=GroupId AND igsm.user_id=UserId
        INNER JOIN question_paper_template_detail qptd ON qptd.question_paper_template_id=qp.question_paper_template_id
        INNER JOIN question_paper_template_detail_question qptdq ON qptdq.question_paper_template_detail_id=qptd.id
        INNER JOIN question_paper_details qpd ON qpd.question_paper_template_detail_question_id=qptdq.id AND qpd.question_paper_id=qp.id
        INNER JOIN tc_question_mapping tcm ON tcm.tc_question_id=qpd.question_id
        INNER JOIN question_paper_evaluation qpe ON qpe.child_question_id=qptdq.id AND qpe.user_id=30 AND qpe.question_paper_id=qp.id AND qpe.tc_question_message_type_id IS NOT NULL
        INNER JOIN topic t ON t.cms_id=tcm.syllabus_chapter_details_id
        INNER JOIN chapter c ON c.id=t.chapter_id   
        WHERE
        CASE WHEN ChapterId IS NOT NULL THEN  //<---I had made changes at this line
             qp.question_paper_status_id >= 7 and c.id = ChapterId
        ELSE
           qp.question_paper_status_id >= 7
        END
        GROUP BY qpe.tc_question_message_type_id LIMIT 5;
        END$$
    
    DELIMITER ;
    

    你可以试试上面的代码。

    我已经添加了CASE WHEN

    【讨论】:

      【解决方案2】:
      IF (ChapterId IS NOT NULL)  THEN
          WHERE qp.question_paper_status_id >= 7 and c.id = ChapterId
      ELSE
          WHERE qp.question_paper_status_id >= 7
      END IF;
      

      你可以改写成

      WHERE qp.question_paper_status_id >= 7
        AND (c.id = ChapterId OR ChapterId IS NULL)
      

      这里不需要 IF 或 CASE 语句。

      【讨论】:

        猜你喜欢
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        相关资源
        最近更新 更多