Фильтр строковых параметров через запятую в предложении Where My SQL - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь отфильтровать записи с помощью условия where в процедуре на основе значений входных параметров IN. Я написал хранимую процедуру в 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 ;

My "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 Ответ

0 голосов
/ 14 апреля 2020

То, что вы передаете процедуре, не является списком: это список через запятую, другими словами скалярное значение. Так что IN не делает то, что вы ожидаете: он фактически проверяет, равен ли bot_id параметру (это включает в себя неявное преобразование в правильный тип данных).

Если вы сохраните параметр как таковой, тогда одним из вариантов является использование строковой функции 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)
)
...