Tech Box To Unbox Ответов: 1

Фильтр разделенных запятыми строковых параметров в предложении where my SQL


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

PIEBALDconsult

Я не знаком с MySQL, но как насчет чего-то подобного, что может работать с SQL Server:
Где CHARINDEX ( ',' + bot_id + ',' , ', ' + p_Bot_Ids + ',' ) > 0

1 Ответов

Рейтинг:
10

Wendelius

Требования немного отличаются в разных частях вашего поста, но если следующее верно

Техник коробку, чтобы распаковать писал:
Давайте рассмотрим, что в моей таблице есть 50 записей. Если я передам "p_Bot_Ids" = "1,2,3", мне нужно будет получить только записи 1,2,3 Ids(всего 3 строки). Если я передам "p_Bot_Ids" = NULL, то я должен получить все свои 50 записей.

Вы могли бы попробовать что-то вроде
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_get_logs_Test`(IN `p_Bot_Ids` VARCHAR(500))
    NO SQL

SET @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';

IF p_Bot_Ids IS NOT NULL THEN
   SET @sql := CONCAT(@sql, ' AND bot_id IN (', p_Bot_Ids, ')');
END IF ;

PREPARE mystatement FROM @sql;
EXECUTE mystatement;
DEALLOCATE PREPARE mystatement$$
DELIMITER ;

Для получения дополнительной информации взгляните на MySQL :: MySQL 8.0 справочное руководство :: 13.5.1 подготовка заявления[^]


Wendelius

Добавил значение null проверить

Tech Box To Unbox

Что произойдет, если "p_Bot_Ids" имеет значение NULL в КОНКАТЕ ? Он принесет все записи ?

Wendelius

Поскольку конкатенация находится внутри оператора if, если p_Bot_Ids имеет значение null, то конкатенация не произойдет.

Чтобы ответить, будет ли запрос извлекать все строки, он будет извлекать строки с идентификатором менее 200, потому что это постоянное условие.

Maciej Los

5ed!

Wendelius

Спасибо!