MYSQL - 存储过程查询简化

MYSQL - Stored Procedure Query Simplify

我是 MYSQL 的新手。

我需要自定义此查询。现在我只使用 IF 条件,查询长度太大了。

在此存储过程中,我们仅根据 _status 值

更改 'f.status' 值

EX:

__status = 'ALL'

ON f.financeId = t.financeId where f.status=0;

__status = 'PAID'

ON f.financeId = t.financeId where f.status=1;

__status = 'UNPAID'

ON f.financeId = t.financeId 其中 f.status=2;

查询:

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `all_data_search`(
_status VARCHAR(50)
)
BEGIN
    IF (_status='All') THEN
    SELECT
    f.financeId,
    f.customerId,
    c.customerName,
    c.initial,
    c.phone1,
    c.aadhaar,
    f.financeStartDate,
    f.vehicleNumber,
    f.loanAmount,
    f.totalInstallment,
    f.installmentAmount,
    COALESCE(t.payedInstallment, 0) as payedInstallment,
    f.status,
    f.created_by,
    f.created_date,
    f.updated_by,
    f.updated_date
FROM finance f
INNER JOIN customer c
    ON c.customerId = f.customerId
LEFT JOIN
(
    SELECT financeId, COUNT(status) AS payedInstallment
    FROM financeinstallment
    WHERE status = 1
    GROUP BY financeId
) t
    ON f.financeId = t.financeId;
    END IF;
    IF (_status='0') THEN
        SELECT
    f.financeId,
    f.customerId,
    c.customerName,
    c.initial,
    c.phone1,
    c.aadhaar,
    f.financeStartDate,
    f.vehicleNumber,
    f.loanAmount,
    f.totalInstallment,
    f.installmentAmount,
    COALESCE(t.payedInstallment, 0) as payedInstallment,
    f.status,
    f.created_by,
    f.created_date,
    f.updated_by,
    f.updated_date
FROM finance f
INNER JOIN customer c
    ON c.customerId = f.customerId
LEFT JOIN
(
    SELECT financeId, COUNT(status) AS payedInstallment
    FROM financeinstallment
    WHERE status = 1
    GROUP BY financeId
) t
    ON f.financeId = t.financeId where f.status=0;
    END IF;
    IF (_status = 'PAID') THEN
    SELECT
    f.financeId,
    f.customerId,
    c.customerName,
    c.initial,
    c.phone1,
    c.aadhaar,
    f.financeStartDate,
    f.vehicleNumber,
    f.loanAmount,
    f.totalInstallment,
    f.installmentAmount,
    COALESCE(t.payedInstallment, 0) as payedInstallment,
    f.status,
    f.created_by,
    f.created_date,
    f.updated_by,
    f.updated_date
FROM finance f
INNER JOIN customer c
    ON c.customerId = f.customerId
LEFT JOIN
(
    SELECT financeId, COUNT(status) AS payedInstallment
    FROM financeinstallment
    WHERE status = 1
    GROUP BY financeId
) t
    ON f.financeId = t.financeId where f.status=1;
     END IF;
     IF (_status = 'UNPAID') THEN
    SELECT
    f.financeId,
    f.customerId,
    c.customerName,
    c.initial,
    c.phone1,
    c.aadhaar,
    f.financeStartDate,
    f.vehicleNumber,
    f.loanAmount,
    f.totalInstallment,
    f.installmentAmount,
    COALESCE(t.payedInstallment, 0) as payedInstallment,
    f.status,
    f.created_by,
    f.created_date,
    f.updated_by,
    f.updated_date
FROM finance f
INNER JOIN customer c
    ON c.customerId = f.customerId
LEFT JOIN
(
    SELECT financeId, COUNT(status) AS payedInstallment
    FROM financeinstallment
    WHERE status = 1
    GROUP BY financeId
) t
    ON f.financeId = t.financeId where f.status=2;
     END IF;
END ;;
DELIMITER ;
declare status_flag smallint;
....

 IF (_status = 'ALL') THEN status_flag=0;
 ELSEIF (_status = 'PAID') THEN status_flag=1;
 ELSEIF (_status = 'UNPAID') THEN status_flag=2;
 ENDIF;

 ....
 WHERE status = status_flag

您可以使用布尔运算如下:

ON f.financeId = t.financeId 
where (__status = 'ALL' and f.status=0)
   or (__status = 'PAID' and f.status=1)
   or (__status = 'UNPAID' and f.status=2);