#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);
Мне потребовалось много времени, чтобы понять это, но теперь это работает для меня.»