Where子句Mysql中的逗号分隔字符串参数过滤器
Posted
技术标签:
【中文标题】Where子句Mysql中的逗号分隔字符串参数过滤器【英文标题】:Comma separated string parameter filter in Where clause My SQL 【发布时间】:2020-07-27 08:27:38 【问题描述】:我正在尝试根据 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 Ids 记录(总共 3 行)。 如果我通过 "p_Bot_Ids" = NULL 那么我应该得到我所有的 50 条记录。
【问题讨论】:
【参考方案1】:你传递给过程的不是一个列表:它是一个逗号分隔的列表,也就是一个标量值。所以IN
并没有达到你的预期:它实际上检查bot_id
是否等于参数(这包括隐式转换为正确的数据类型)。
如果您要保持参数不变,那么一种选择是改用string function find_in_set()
:其目的是在逗号分隔的列表中搜索值。
where id < 200 and find_in_set(bot_id, p_Bot_Ids)
如果你也想匹配 null
值,那么:
where id < 200
and (
(bot_id is null and p_Bot_Ids is null)
or find_in_set(bot_id, p_Bot_Ids)
)
【讨论】:
如果我将 NULL 值传递给 p_Bot_Ids,它会给出 0 条记录。但使用价值观。 @SrikanthReddy:你想如何处理NULL
值?如果参数为null,是否要选择bot_id
为NULL
的行?
@SrikanthReddy:我更新了我的答案以处理 null
值。
如果我将 Null 传递给参数,我不想考虑该参数。无论使用“p_Bot_Ids”进行过滤,我都需要获取所有记录。如果我将值传递给需要过滤的参数,这种情况就像你说的那样工作。
用需要的例子编辑了问题。请检查一次。对于 NULL 情况。以上是关于Where子句Mysql中的逗号分隔字符串参数过滤器的主要内容,如果未能解决你的问题,请参考以下文章
使用 WHERE IN SQL 子句将字符串值从单个值拆分为多个值以获取数据