Я ищу способ использовать ключевое слово 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
Вся помощь приветствуется.
WHERE FIND_IN_SET(CID, "145,45,452")
Но этот запрос всегда будет вызывать fullscan таблицы. Поэтому я предлагаю вам переписать свой код и использовать правильный синтаксис IN (A, B, C)
.
У вас есть два варианта. Чем чаще, перепишите свой запрос следующим образом:
SELECT * FROM table_name WHERE CID IN (?, ?, ?, ..., ?);
Я не уверен, что другой действителен для MySQL, но он отлично работает в PostgreSQL. Он должен использовать неизменяемую функцию, которая анализирует строку в наборе целых чисел и вместо этого использует:
SELECT * FROM table_name WHERE CID IN (split_to_int(?));
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);
Мне долго понадобилось это, но теперь это работает для меня ".