2016-08-03 2 views
1

В моем запросе (база данных сервера SQL) Я использую RegEx для выбора команды, как это:Используйте String для RegEx в запросе

SELECT * FROM test WHERE id LIKE '1[2,3]' 

(Этот запрос проверяется и возвращает данные, которые я хочу)


Я хочу использовать параметр для этого RegEx. Для этого я остановил параметр Paramter в iReport $P{id} как строку, а значение - "1[2,3]".

В моем запросе я использую в настоящее время этот параметр так:

SELECT * FROM test WHERE id LIKE $P{id} 

В результате я получаю пустую страницу. Я думаю, проблема в том, что значение параметра определяется с помощью "". Но с '' Я получаю ошибку компилятора, что параметр не является строкой.

Я надеюсь, что кто-то может мне помочь.

+0

Что возвращается при запуске select $ P {id} – scsimon

+0

Является ли 'id' текстовым или числовым столбцом? Примечание. Разделители строк не являются частью строкового значения (они являются частью синтаксиса Java), а jasper-reports будут содержать строку в одинарных кавычках. Например. '" A .length() == 1' (не 3). –

+0

@ OlivierJacot-Descombes Id - это числовая колонка. – Blobonat

ответ

1

LIKE применяется к текстовым значениям, а не к числовым значениям. Поскольку id числовой использовать что-то вроде этого:

SELECT * FROM test WHERE id IN (12, 13) 

с параметром

SELECT * FROM test WHERE id IN ($P!{id_list}) 

и поставить разделенный запятыми список идентификаторов для параметра. Bang (!) Гарантирует, что параметр будет вставлен как есть, без разделителей строк.

Btw: LIKE (Transact-SQL) использует подстановочные знаки, а не регулярное выражение.

Вы можете использовать LIKE, поскольку существует implicit conversion из числовых типов в текст в T-SQL, но это приведет к (таблица или индекс) сканирования, где, как пункт IN может воспользоваться индексами.

+0

Большое спасибо. – Blobonat

+0

Я не уверен, даже если это список id (целочисленный), который рекомендуется использовать для замены такого рода, я думаю, что подготовленный оператор всегда был prefeered. –

1

Принятый ответ работает, но он использует замену строки, более подробно о sql-injection, чтобы понять, почему это не очень хорошая практика.

Правильный способ выполнить этот запрос IN в отчете яшмы (используя подготовленное заявление) является:

SELECT * FROM test WHERE $X{IN, id, id_list} 

Для получения дополнительной информации, как использование NOTIN, BETWEEN ЕССА. см. JasperReports sample reference for query

+2

SQL-инъекция не проблема для моего проекта, потому что БД является локальным, а данные в нем не интересны.Но я согласен, что это может быть проблемой в других проектах. '$ X' для меня совершенно новый. Насколько я читал об этом, это кажется очень хорошим решением. Спасибо за ваш ответ. – Blobonat

Смежные вопросы