MySQL: Разделите строку SQL, которая будет использоваться в предложении WHERE

#mysql #sql #jasper-reports

#mysql #sql #jasper-отчеты

Вопрос:

Я ищу способ использовать ключевое слово IN в JasperReport. Мой запрос выглядит следующим образом:

 SELECT * FROM table_name WHERE CID IN (145,45, 452);
  

после этого в отчете jasper я могу настроить это;

 SELECT * FROM table_name WHERE CID IN ($P{MY_CIDS});
  

и из моей Java я бы отправил $P{MY_CIDS} как String , поэтому мой запрос будет выглядеть как

 SELECT * FROM table_name WHERE CID IN ("145,45, 452");
  

Мои вопросы в том, как преобразовать SQL "145,45, 452" в допустимый запрос, чтобы он учитывал каждое значение отдельно 145 , 45 , 452

Любая помощь приветствуется.

Ответ №1:

 WHERE FIND_IN_SET(CID, "145,45,452")
  

Но этот запрос всегда будет вызывать полное сканирование таблицы. Поэтому я предлагаю вам переписать свой код и использовать правильный IN (A, B, C) синтаксис.

Комментарии:

1. хорошее решение, оно работает таким образом. Я не возражаю против полного сканирования в настоящее время, поскольку этот отчет генерируется только два раза в год.

Ответ №2:

У вас есть два варианта. Более распространенным является переписывание вашего запроса следующим образом вместо:

 SELECT * FROM table_name WHERE CID IN (?, ?, ?, ..., ?);
  

Я не уверен, что другое допустимо для MySQL, но оно отлично работает в PostgreSQL. Это использовать неизменяемую функцию, которая преобразует строку в набор целых чисел, и вместо этого использовать:

 SELECT * FROM table_name WHERE CID IN (split_to_int(?));
  

Комментарии:

1. спасибо @Denis, к сожалению, в MySQL нет split_to_int .

2. @Adnan: Я бы сказал, что, к счастью , такой функции не существует 😉 Иначе никто никогда не позаботится о нормализованных схемах БД 😉

3. @Adnan: под этим я имел в виду, что вы бы написали эту функцию самостоятельно, если бы в MySQL было возможно написать функции, возвращающие set.

Ответ №3:

 SELECT * FROM table_name WHERE CID IN ($P!{MY_CIDS});
  

Просто используйте

 $P!{MY_CIDS}
  

(восклицательный знак между $P и {MY_CIDS}).

Теперь Jasper будет объединять строки следующим образом:

 "SELECT * FROM table_name WHERE CID IN ("
 "145,45,452"
 ")";
  

в результате:

 SELECT * FROM table_name WHERE CID IN (145,45,452);
  

Мне потребовалось много времени, чтобы понять это, но теперь это работает для меня.»