Використання підказки "як" у підготовленій заяві


176

Я використовую підготовлені оператори для виконання запитів до бази даних mysql. І я хочу реалізувати функцію пошуку, засновану на сортування ключових слів.

Для цього мені потрібно використовувати LIKEключове слово, стільки я знаю. І я раніше також використовував підготовлені заяви, але я не знаю, як це використовувати, LIKEоскільки з наведеного нижче коду, куди я би додав 'keyword%'?

Чи можу я безпосередньо використовувати його pstmt.setString(1, notes)як (1, notes+"%")щось подібне. Я бачу в Інтернеті багато публікацій з цього приводу, але жодної хорошої відповіді ніде.

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

Відповіді:


281

Потрібно встановити його в самому значенні, а не в підготовленому рядку SQL оператора.

Отже, це слід зробити для збігу префіксів:

notes = notes
    .replace("!", "!!")
    .replace("%", "!%")
    .replace("_", "!_")
    .replace("[", "![");
PreparedStatement pstmt = con.prepareStatement(
        "SELECT * FROM analysis WHERE notes LIKE ? ESCAPE '!'");
pstmt.setString(1, notes + "%");

або збіг суфікса:

pstmt.setString(1, "%" + notes);

або глобальний матч:

pstmt.setString(1, "%" + notes + "%");

18
+1 ОП може «встановити» його в SQL - як за ... LIKE '%' || ? || '%'схожим, так і подібним - але це набагато менш гнучко.
pilcrow

як мені це зробити в режимі НЕЧАСНОГО ЧИСЛЕННЯ? :)
Альфа Габріель В. Тимбол

2
Все ще можна використовувати WHERE UPPER(?) LIKE UPPER(?)під час використанняpstmt.setString(2, "%" + notes + "%")
Zig

1
@Alain: Дякую Цікаво, чи це стосується всіх RDBMS, про які знає світ? Можливо, '%' || ? || '%'як було сказано в першому коментарі, все-таки було краще? Зараз у мене немає можливості експериментувати.
BalusC

2
@BalusC це стосується MSSQL, Postgres та MySQL під час мого тестування. Рядок, що перетворюється в параметр, сам інтерпретується як сукупність даних та інструкцій управління. Конкатенація SQL відбувається до того, як вона буде інтерпретована та зберігає вразливість. Центр безпечного дизайну IEEE говорить про суворо відокремлені інструкції щодо даних та контролю, а також ніколи не обробляйте інструкції контролю, отримані від ненадійних джерел .
Ален О'Деа

28

Зашифруйте це так:

PreparedStatement pstmt = con.prepareStatement(
    "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes + "%");`

Переконайтесь, що ви НЕ включаєте цитати ", як показано нижче, оскільки вони спричинить виняток.

pstmt.setString(1,"'%"+ notes + "%'");

1
Хоча це здається, що хтось не зіткнеться з цим припущенням, це насправді дуже справедливо, особливо при роботі з Oracle. Дякуємо, що вказали!
asgs

5

ми можемо це зробити просто, використовуючи функцію CONCATE SQL.

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like CONCAT( '%',?,'%')";
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

це ідеально підходить для мого випадку.


4
PreparedStatement ps = cn.prepareStatement("Select * from Users where User_FirstName LIKE ?");
ps.setString(1, name + '%');

Спробуйте це.



-13
String query="select * from test1 where "+selected+" like '%"+SelectedStr+"%';";


PreparedStatement preparedStatement=con.prepareStatement(query);


// where seleced and SelectedStr are String Variables in my program

це небезпечно, будь ласка, використовуйте параметризовану підготовлену заяву.
Дургеш Кумар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.