Невозможно использовать запрос LIKE в JDBC PreparedStatement?
Код запроса и запрос:
ps = conn.prepareStatement("select instance_id, ? from eam_measurement where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where resource_group_id = ?) and DSN like '?' order by 2"); ps.setString(1,"SUBSTR(DSN,27,16)"); ps.setInt(2,defaultWasGroup); ps.setString(3,"%Module=jvmRuntimeModule:freeMemory%"); rs = ps.executeQuery(); while (rs.next()) { bla blah blah blah ...
Возвращает пустой ResultSet
.
Через базовую отладку я обнаружил ее третье связывание, которое является проблемой, т.е.
- MySQL SELECT LIKE или REGEXP для сопоставления нескольких слов в одной записи
- Как запросить MongoDB с «как»?
- MySQL - Как найти точное совпадение слов, используя LIKE?
- mysql как повышение производительности
- Фильтрация строки, содержащей определенную строку с использованием dplyr
DSN like '?'
Я пробовал всевозможные вариации, наиболее разумные из которых, казалось, использовались:
DSN like concat('%',?,'%')
но это не работает, поскольку мне не хватает '
по обе стороны от конкатенированной строки, поэтому я пытаюсь:
DSN like ' concat('%',Module=P_STAG_JDBC01:poolSize,'%') ' order by 2
но я просто не могу найти способ получить их в этих работах.
Что мне не хватает?
- Microsoft Office Access `LIKE` VS` RegEx`
- Параметр в подобном разделе JPQL
- Поиск строки в текстовом столбце в MySQL
- Как ускорить выбор SELECT .. LIKE запросов в MySQL на нескольких столбцах?
- Как сделать SQL как% в Linq?
- Является ли LIKE-оператор чувствительным к регистру с сервером MSSQL?
- Изменения производительности запросов PostgreSQL LIKE
- Оператор LIKE в LINQ
Во-первых, заполнители-заполнители PreparedStatement
(эти вещи) предназначены только для значений столбцов , а не для имен таблиц, имен столбцов, функций / предложений SQL и т. Д. Вместо этого лучше используйте String#format()
. Во-вторых, вы не должны указывать заполнители, как '?'
, это будет только искажать окончательный запрос. Установки PreparedStatement
уже выполняют задание на цитаты (и экранирование) для вас.
Вот фиксированный SQL:
private static final String SQL = "select instance_id, %s from eam_measurement" + " where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where" + " resource_group_id = ?) and DSN like ? order by 2");
Вот как его использовать:
String sql = String.format(SQL, "SUBSTR(DSN,27,16)"); // This replaces the %s. preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, defaultWasGroup); preparedStatement.setString(2, "%Module=jvmRuntimeModule:freeMemory%");
См. Также :
- Учебник Sun JDBC: использование подготовленных заявлений
- Синтаксис строки форматирования
В вашем заявлении есть две проблемы. Вы должны понимать, как работают переменные привязки. Запрос не обрабатывается путем замены символов ?
с вашими параметрами. Вместо этого оператор компилируется с помощью заполнителей, а затем во время выполнения фактические значения параметров передаются в БД.
Другими словами, вы анализируете следующий запрос:
SELECT instance_id, :p1 FROM eam_measurement WHERE resource_id IN (SELECT RESOURCE_ID FROM eam_res_grp_res_map WHERE resource_group_id = :p2) AND DSN LIKE '?' ORDER BY 2
Я уверен, что последний параметр будет проигнорирован, потому что он находится в разделительной символьной строке. Даже если это не игнорируется, не имеет смысла иметь '
персонажей», потому что Oracle не будет связывать параметр в строке (я удивлен, что он не вызвал ошибок, вы ловите исключения?).
Теперь, если вы замените свой DNS LIKE '?'
с DSN LIKE ?
и связать "%Module=jvmRuntimeModule:freeMemory%"
это будет иметь смысл и должно возвращать правильные строки.
У вас все еще есть проблема с вашим первым параметром, он не будет делать то, что вы ожидаете, т.е. запрос, который будет выполнен, будет эквивалентен следующему запросу:
SELECT instance_id, 'SUBSTR(DSN,27,16)' FROM ...
что совсем не так, как
SELECT instance_id, SUBSTR(DSN,27,16) FROM ...
Я бы предложил parsing (= prepareStatement) следующий запрос, если вы ожидаете, что SUBSTR будет динамическим:
SELECT instance_id, SUBSTR(DSN,?,?) FROM eam_measurement WHERE resource_id IN (SELECT RESOURCE_ID FROM eam_res_grp_res_map WHERE resource_group_id = ?) AND DSN LIKE ? ORDER BY 2
Если вы хотите использовать LIKE в подготовленной инструкции, а также хотите использовать% символов в LIKE;
напишите подготовленный оператор как обычно «…. LIKE? ….» и при присвоении значения параметра знаку вопроса
ps.setString(1, "%" + "your string value" + "%");
Это будет работать 🙂
Опустить '
вокруг» ?
, Без '
, ?
является заполнитель для параметра. С его помощью это строка SQL (т.е. такая же, как "?"
В Java).
Затем вы должны конкатенировать строку на стороне Java; вы не можете передавать SQL-функции в качестве параметров для запросов; только базовые значения (например, string, integer и т. д.), потому что драйвер JDBC преобразует этот параметр в тип SQL, который ожидает firebase database, и он не может выполнять SQL-функции на этом этапе.
Можешь попробовать:
String beforeAndAfter = "%" + yourVariable + "%";
Это должно работать:
"\'" + "?" + "\'"
PreparedStatement ps = con.prepareStatement( "select columname from tablename where LOWER(columnname) LIKE LOWER('"+var+"%')");
Здесь var
– это переменная, в которой хранится значение, которое нужно искать. …