我正在尝试基于IN输入参数值在过程中使用where子句过滤记录,我已经在My SQL中编写了存储过程,如下所示:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_get_logs_Test`(IN `p_Bot_Ids` VARCHAR(500))
NO SQL
select id, bot_id, log_level,log_type,time_stamp,finger_print,windows_identity,machine_name,process_name,process_version
,job_Id,robot_name,machine_Id,file_name,message,created_date from log
where id < 200 and
bot_id IN (p_Bot_Ids)$$
DELIMITER ;
我的“ p_Bot_Ids”是逗号分隔的字符串。如果我通过“ 1,2”,则仅使用“ 1”进行过滤。如果我通过“ 2,1”,则仅使用“ 2”进行过滤。
也我的“ p_Bot_Ids”也可以为空。在这种情况下,我需要提取所有记录。
让我们考虑一下我的表中有50条记录。如果我通过“ p_Bot_Ids” =“ 1,2,3”,我只需要获取1,2,3个ID记录(总共3行)。如果我通过“ p_Bot_Ids” = NULL,那么我应该得到我所有的50条记录。
您要传递给该过程的不是列表:它是逗号分隔的列表,换句话说,是标量值。因此IN
并没有达到您的期望:它实际上检查bot_id
是否等于参数(这包括隐式转换为正确的数据类型)。
如果要保持参数不变,那么一个选择是使用string function find_in_set()
:其目的是在逗号分隔的列表中搜索值。
find_in_set()
如果您也想匹配where id < 200 and find_in_set(bot_id, p_Bot_Ids)
值,则:
null