Как передать подстановочный знак «%» оператору LIKE CONCAT с помощью PgPreparedStatementJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как передать подстановочный знак «%» оператору LIKE CONCAT с помощью PgPreparedStatement

Сообщение Anonymous »

Мне нужно создать sql, используя запрос PgPreparedStatement(postgres), который имеет оператор concat. Запрос выглядит примерно так:

Код: Выделить всё

Select * from guest gg where
gg.city LIKE CONCAT('PHOENI_' , '%');
Это выглядит довольно просто, но запрос sql создается с использованием некоторых пользовательских классов, и поэтому

Код: Выделить всё

pstmt.setString(1, x); // dummy value 1
тогда значение x здесь включает «%», и запрос формируется неправильно. Ниже приведены варианты, которые я использовал в 'x', и соответствующий запрос, сформированный:
[img]https: //i.sstatic.net/f5zSzfJ6.png[/img]

Я вижу, что если целевая строка не имеет одинарных кавычек, то AcceptedStatement добавит одинарные кавычки вокруг цели String (случай 1 изображения), но если я добавлю одинарные кавычки где-нибудь внутри целевой строки, то ReadyStatement добавит одинарную кавычку перед каждой встреченной одиночной кавычкой.
Я попробовал представленное здесь решение: использование подстановочного знака «нравится» в подготовленном операторе, но результат тот же.
Я думаю, проблема в том, что строковое значение, которое ReadedStatement будет использовать для замены маркера, всегда будет иметь "%" (вот как классы они очень старые и, по крайней мере, не могут быть изменены сейчас). В принципе, я не могу сделать что-то подобное:

Код: Выделить всё

Select * from guest gg where gg.city LIKE CONCAT(? , '%');
pstmt.setString(1, "xyz"); // the string that will be used to replace the marker will either have "%" or not.
Итак, с учетом этих ограничений, есть ли способ сделать запрос

Код: Выделить всё

Select * from guest gg where
gg.city LIKE CONCAT('PHOENI_' , '%');
Заранее спасибо!
Изменить 1:
Запрос формируется с использованием специального класса (CreateCriteria). Этот класс имеет 3 параметра:
  • type(тип данных, который будет заменять '?')
  • operator( LIKE CONCAT , LIKE и т. д.)
  • значение (значение для замены '?')
Насколько Речь идет о ReadedStatement, он создается с использованием объекта Connection и запроса sql.

Код: Выделить всё

this.pstmt = m_con.prepareStatement(qry.toString());
Проблема здесь в том, что для работы LIKE CONCAT мне нужно передать "%", но при проектировании класса значение, которое заменяет заполнитель, всегда имеет "%", и поэтому подготовленный оператор рассматривает его как одно строковое значение. (примеры представлены на скриншоте).

Подробнее здесь: https://stackoverflow.com/questions/788 ... dstatement
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»