준비된 명령문에서 "like"와일드 카드 사용


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 OP는 SQL에서 ... LIKE '%' || ? || '%'또는 이와 유사한 방식 으로 OP를 "설정"할 수 있지만 유연성은 훨씬 떨어집니다.
순례자

비대 소문자 구분 모드로 어떻게해야합니까? :)
Alpha Gabriel V. Timbol

2
비 대소 문자 구분은 여전히 사용할 수 있습니다 WHERE UPPER(?) LIKE UPPER(?)사용하는 경우pstmt.setString(2, "%" + notes + "%")
지그

1
@Alain : 감사합니다. 궁금 할 것입니다. 이것이 전 세계가 알고있는 모든 RDBMS에 적용됩니까? 아마도 '%' || ? || '%'첫 번째 의견에서 언급했듯이 아마도 더 좋았습니까? 지금 실험 할 기회가 없습니다.
BalusC

2
@BalusC 이것은 내 테스트에서 MSSQL, Postgres 및 MySQL에 적용됩니다. 매개 변수로 작성되는 문자열 자체는 데이터 및 제어 명령의 혼합으로 해석됩니다. SQL 연결은 해석되기 전에 발생하며 취약점을 보존합니다. 안전한 설계를위한 IEEE 센터는 데이터와 제어 명령엄격히 분리하고 신뢰할 수없는 출처로부터받은 제어 명령을 절대 처리하지 말라고 말합니다 .
Alain O'Dea

28

다음과 같이 코딩하십시오.

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

당신이 있는지 확인 하지 마십시오 그들은 예외가 발생합니다 아래와 같은 따옴표 ''를 포함한다.

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

1
누군가 가이 가정에 부딪치지 않는 것처럼 들리지만 실제로 Oracle과 작업 할 때 실제로 매우 유효합니다. 지적 해 주셔서 감사합니다!
ass

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

안전하지 않으며 친절하게 매개 변수화 된 준비된 진술을 사용하십시오.
Durgesh Kumar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.