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_idNULL的行? @SrikanthReddy:我更新了我的答案以处理 null 值。 如果我将 Null 传递给参数,我不想考虑该参数。无论使用“p_Bot_Ids”进行过滤,我都需要获取所有记录。如果我将值传递给需要过滤的参数,这种情况就像你说的那样工作。 用需要的例子编辑了问题。请检查一次。对于 NULL 情况。

以上是关于Where子句Mysql中的逗号分隔字符串参数过滤器的主要内容,如果未能解决你的问题,请参考以下文章

使用 WHERE IN SQL 子句将字符串值从单个值拆分为多个值以获取数据

MySQL“IN”子句中的逗号分隔值

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

where子句中的多个字符匹配

SQL IN 逗号分隔参数与内部查询

如何将 ObjectQuery 与由 OR 子句分隔的 Where 过滤器一起使用