2016-11-22 5 views
1

검색 상자에 주어진 입력을 기반으로 데이터를 검색해야한다는 요구 사항이 있습니다. 이postgresql의 where 쿼리에서 %를 전달하여 데이터 필터링

SELECT distinct d.desktop_id as desktopId, 
       d.name as desktopName 
from desktoptable 
where d.name 
ilike '%'+searchString+'%' 

되는 searchString처럼 쿼리 작성이 문제를 처리하기 위해 : 아무것도 입력 난 쿼리에 전달하고 모두 없습니다. 이 쿼리는 % 및 _을 제외한 다른 모든 입력 문자열을 올바르게 처리합니다. postgres 문서에서 "_ 및 %는 각각 단일 문자 및 임의의 문자열을 나타내는 와일드 카드 문자로 읽습니다".

데이터를 필터링하기 위해 쿼리에 % 또는 _를 입력으로 전달할 수 있습니다. 내 DB에는 거기에 %와 _도있는 레코드가 있습니다.

누구든지이 문제를 해결하는 방법을 알려줄 수 있습니까?

답변

1

대부분의 경우 글로벌 ILIKE 검색은 Postgres에서 실행되는 실제 SQL 쿼리에서 생각한 방식을 연결하지 않습니다. 이러한 이유로 SQL 주입과 같은 것을 피하기 위해서는 Java로 prepared statement를 사용해야합니다. 이런 식으로 뭔가 작업을해야합니다 :

String query = "SELECT distinct d.desktop_id as desktopId, d.name as desktopName "; 
     query += "from desktoptable where d.name ilike ?"; 
PreparedStatement stmt = con.prepareStatement(query); 
stmt.setString(1, "%" + handle(searchString) + "%"); 
여기

handle() 특히 와일드 카드를 탈출하고 LIKE 운영자에 사용하기 위해 강조하는 방법이다. AFAIK 준비 문은 이 아니며이 자동으로 수행됩니다.

public String handle (String input) { 
    return input.replaceAll("%", "\\%") 
       .replaceAll("_", "\\_"); 
} 

나는 포스트 그레스에이 테스트 및 단일 백 슬래시는 LIKE 특수 문자를 탈출하기에 충분한 것 같다.

+0

귀하의 제안은 맞지만 OP는 % _을 (를) 이스케이프하고 싶습니다. –

+0

@ 예 안녕하세요. 나는 그렇게 생각하지 않습니다. 와일드 카드 검색을 원한다고 보입니다.이 경우'%'는 어떤 식 으로든 이스케이프 처리되지 않아야합니다. –

+0

그래서 그가 % _와 같은 매개 변수를 넣으면 쿼리는 "ILIKE % aa % _ %"가됩니다. 데이터를 필터링하기 위해 쿼리에 입력으로 % 또는 _를 전달하려고하기 때문에 –