mysql 如果传递的参数之一为空,如何使存储过程选择所有内容?

bq9c1y66  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(230)

我正在做一个使用数据库的项目,我在MySQL tba_instruments 中创建了一个表,其中包含每种乐器的ID和名称,如下所示:

| INSTRUMENT_ID | INSTRUMENT_NM |
| --------      | --------      |
| 1             | Violin        |
| 2             | Cello         |
| 3             | Flute         |
| 4             | Trumpet       |

为了通过特定的过滤器来获取仪器,我编写了这个存储过程

DELIMITER //
CREATE PROCEDURE GetInstruments_ByFilter(
    IN instrument_id INT, 
        IN instrument_name VARCHAR(255)
        )
BEGIN
    SELECT * FROM tba_instrument 
    WHERE ID_INSTRUMENT = instrument_id
    AND INSTRUMENT_NM = instrument_name;
END //
DELIMITER ;

CALL GetInstruments_ByFilter(1, 'Violin');

结果:

| INSTRUMENT_ID | INSTRUMENT_NM |
| 1             | Violin        |

如果传递的参数与表中的参数匹配,它就可以正常工作。但是如果其中一个参数为空,我希望它有不同的行为,例如:

CALL GetInstruments_ByFilter('Violin');

它会打印一个错误消息,因为一个参数丢失了。我希望它只显示整个表而不是错误消息。在MySQL中有办法做到这一点吗?
到目前为止,我所想的只是为这个特定的情况创建一个不同的存储过程,但这看起来并不是最好的解决方案。

toiithl6

toiithl61#

您可以利用IFNULL函数。

DELIMITER //
CREATE PROCEDURE GetInstruments_ByFilter(
instrument_id INT, 
instrument_name VARCHAR(255)
)
BEGIN

SELECT * 
FROM tba_instrument 
WHERE ID_INSTRUMENT = IFNULL(instrument_id, ID_INSTRUMENT) 
   AND INSTRUMENT_NM = IFNULL(instrument_name, INSTRUMENT_NM);
END //
DELIMITER ;

CALL GetInstruments_ByFilter(1, 'Violin');
CALL GetInstruments_ByFilter(1, NULL);
CALL GetInstruments_ByFilter(NULL, 'Violin');

相关问题