我想用动态子句制作 MySQL 存储过程 where [关闭]

Posted

技术标签:

【中文标题】我想用动态子句制作 MySQL 存储过程 where [关闭]【英文标题】:i want to make MySQL stored procedure with dynamic clause where [closed] 【发布时间】:2020-04-07 23:45:31 【问题描述】:
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_Name4`(
    IN a int(255),
    IN b int(255),
    IN dept_id_in int(255)
)
BEGIN
    SELECT
        emp.emp_id, emp.emp_name,
        emp.emp_job, 
        emp.dept, 
        emp.percent_doctor,
        emp.percent_center,
        patient_exam.exam_id,
        patient_exam.p_id,
        ABS(SUM(patient_exam.exam_price)) as SUM_price,
        ABS((SUM(patient_exam.exam_price)*  emp.percent_center )/100   ) as total_doc,
        ABS((SUM(patient_exam.exam_price)*  emp.percent_doctor )/100   ) as total_center
    FROM emp
    LEFT JOIN patient_exam on emp.emp_id = patient_exam.doctor
    WHERE 
        emp.emp_is_delete = 0 
        and patient_exam.ex_is_delete = 0 
        and 1=1 
        CASE 
            WHEN dept_id_in IS not NULL 
            THEN and patient_exam.dept_id=dept_id_in
        END                         
    GROUP BY emp.emp_id, patient_exam.exam_id 
    ORDER BY emp.emp_id, patient_exam.exam_id DESC 
    LIMIT a,b;
END$$

DELIMITER ;

【问题讨论】:

值得考虑写一个VIEW。这不能像VIEW 一样扩展。 ***.com/a/697685/1880170 已在此链接中回答。 【参考方案1】:

我怀疑你想要一些布尔逻辑而不是 case 表达式:

WHERE 
    emp.emp_is_delete = 0 
    AND patient_exam.ex_is_delete = 0 
    AND (dept_id_in IS NULL OR patient_exam.dept_id = dept_id_in)

你也可以用COALESCE()来表达:

WHERE 
    emp.emp_is_delete = 0 
    AND patient_exam.ex_is_delete = 0 
    AND patient_exam.dept_id = COALESCE(dept_id_in, patient_exam.dept_id)

【讨论】:

以上是关于我想用动态子句制作 MySQL 存储过程 where [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我想用动态行制作带有动态部分的 Utableview

如何使用 SQL 格式的动态 where 子句制作谓词

MySQL 在多个外部连接的子句中放置条件

在实体框架中使用动态 where 子句

在mysql select语句中使用条件where子句

在 Where 子句中使用 case 构建动态查询