Where子句My SQL中用逗号分隔的字符串参数过滤器

问题描述 投票:0回答:1

我正在尝试基于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条记录。

mysql sql csv stored-procedures mysql-python
1个回答
0
投票

您要传递给该过程的不是列表:它是逗号分隔的列表,换句话说,是标量值。因此IN并没有达到您的期望:它实际上检查bot_id是否等于参数(这包括隐式转换为正确的数据类型)。

如果要保持参数不变,那么一个选择是使用string function find_in_set():其目的是在逗号分隔的列表中搜索值。

find_in_set()

如果您也想匹配where id < 200 and find_in_set(bot_id, p_Bot_Ids) 值,则:

null
© www.soinside.com 2019 - 2024. All rights reserved.