You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL存储过程:基于配送公司参数的条件式连接与过滤实现咨询

MySQL存储过程条件关联表与过滤实现方案

在MySQL存储过程中,针对不同配送公司类型的分支逻辑,主要有两种实现方式,以下是具体示例和说明:

方式一:IF分支直接编写不同查询逻辑

适合分支逻辑差异较大、代码可读性要求高的场景,直接通过IF/ELSEIF区分不同参数对应的查询语句:

DELIMITER //

CREATE PROCEDURE GetDeliveryRecords(IN p_delivery_type VARCHAR(50))
BEGIN
    IF p_delivery_type = 'CENTRAL_FULFILMENT' THEN
        -- 中央仓配送:关联额外表过滤
        SELECT 
            o.order_id,
            o.customer_name,
            cf.warehouse_id,
            cf.inventory_status
        FROM orders o
        JOIN central_fulfilment cf ON o.order_id = cf.order_id
        JOIN warehouse w ON cf.warehouse_id = w.warehouse_id
        WHERE w.is_active = 1;
    ELSEIF p_delivery_type = 'STANDARD' THEN
        -- 标准配送:WHERE子句添加特定过滤条件
        SELECT 
            o.order_id,
            o.customer_name,
            o.delivery_address
        FROM orders o
        WHERE o.delivery_method = 'STANDARD' 
          AND o.order_status = 'SHIPPED';
    ELSE
        -- 处理其他未匹配的配送类型(可选)
        SELECT 
            o.order_id,
            o.customer_name
        FROM orders o;
    END IF;
END //

DELIMITER ;

方式二:动态SQL拼接语句

适合逻辑灵活、分支较多且存在代码复用场景的需求,通过拼接SQL字符串实现动态逻辑:

DELIMITER //

CREATE PROCEDURE GetDeliveryRecordsDynamic(IN p_delivery_type VARCHAR(50))
BEGIN
    DECLARE sql_query VARCHAR(1000);
    
    -- 初始化基础查询字段
    SET sql_query = 'SELECT o.order_id, o.customer_name ';
    
    -- 根据参数拼接关联表、字段和过滤条件
    IF p_delivery_type = 'CENTRAL_FULFILMENT' THEN
        SET sql_query = CONCAT(sql_query, ', cf.warehouse_id, cf.inventory_status ');
        SET sql_query = CONCAT(sql_query, 'FROM orders o ');
        SET sql_query = CONCAT(sql_query, 'JOIN central_fulfilment cf ON o.order_id = cf.order_id ');
        SET sql_query = CONCAT(sql_query, 'JOIN warehouse w ON cf.warehouse_id = w.warehouse_id ');
        SET sql_query = CONCAT(sql_query, 'WHERE w.is_active = 1 ');
    ELSEIF p_delivery_type = 'STANDARD' THEN
        SET sql_query = CONCAT(sql_query, ', o.delivery_address ');
        SET sql_query = CONCAT(sql_query, 'FROM orders o ');
        SET sql_query = CONCAT(sql_query, 'WHERE o.delivery_method = ''STANDARD'' ');
        SET sql_query = CONCAT(sql_query, 'AND o.order_status = ''SHIPPED'' ');
    ELSE
        SET sql_query = CONCAT(sql_query, 'FROM orders o ');
    END IF;
    
    -- 执行动态生成的SQL
    PREPARE stmt FROM sql_query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //

DELIMITER ;

关键注意事项

  • 若参数可能包含外部输入,使用动态SQL时需避免直接拼接参数,改用占位符绑定防止SQL注入,示例如下:
    -- 安全的动态SQL参数绑定示例
    IF p_delivery_type = 'STANDARD' THEN
        SET sql_query = 'SELECT o.order_id, o.customer_name FROM orders o WHERE o.delivery_method = ? AND o.order_status = ?';
        PREPARE stmt FROM sql_query;
        SET @method = 'STANDARD';
        SET @status = 'SHIPPED';
        EXECUTE stmt USING @method, @status;
    END IF;
    
  • 建议添加ELSE分支处理未匹配的参数值,避免无返回结果的情况。

内容的提问来源于stack exchange,提问作者Prachi Prajapati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:32:22