2010-12-07 2 views
3

다음과 같은 조회가 있습니다.WHERE x IN 절을 사용하여 PreparedStatement에 대한 SQL을 작성하는 방법은 무엇입니까?

SELECT last_name, 
     first_name, 
     middle_initial 
FROM names 
WHERE last_name IN ('smith', 'jones', 'brown') 

IN 절에서 목록을 매개 변수화하여 JDBC PreparedStatement로 작성할 수 있어야합니다. 이 목록에는 여러 개의 이름이 포함될 수 있습니다.

이렇게하는 올바른 방법은 무엇입니까?

SELECT last_name, 
     first_name, 
     middle_initial 
FROM names 
WHERE last_name IN (?) 

그런 다음 매개 변수 목록을 작성 하시겠습니까? 또는 더 나은 (더 정확한) 방법이 있습니까?

+1

도움이 여기에 질문을 받았다 : http://stackoverflow.com/ 질문/178479/java-sql-prepared-in-clause-issue 문에 – Todd

+0

IN 절에서 보낼 수있는 매개 변수 수가 제한적이라고 생각하십시오 –

답변

0

표준 SQL에서는 IN 절을 쉼표로 구분 된 값 목록으로 실행하기 전에 문자열로 작성되는 동적 SQL 만 단일 변수로 매개 변수화 할 수 없습니다.

0

이 주제도 연구 할 예정입니다. 나는 비슷한 코드를 작성한 것에 대해 유죄를 인정 받았으며 결코 100 % 편안함을 느끼지 못했습니다. "변수 SQL 매개 변수 목록"에서 뭔가를 찾고 싶습니다.

코드에서

, 최대 절전 모드를 사용하고 쉼표로 구분 된 순서 ID의 문자열을 주어진이, 내가 사용했습니다 :

ORDERID 반면
Session s = getSession(); 
Criteria crit = s.createCriteria(this.getOrderListingClass()); 
crit.add(Expression.sql(String.format("{alias}.orderId in (%s)", orderIds))); 
crit.add(Expression.eq("status", OrderInfo.Order_STATUS_UNFILLED)); 
orders = crit.list(); 

정말 "Y로부터 X를 선택 WHERE IN (% s의의 일부입니다) ". 내가 이전에 최대 절전 모드로 전달에 검증을 통해 orderIds 문자열을 실행 않았다

  1. - 주사 두려워되는 등

  2. 내가 했었어 다른

    뭔가에 한계를 확인하다 SQL 매개 변수 W 조회의. 자 수. 나는 어딘가에 2000+ (MS SQL과 함께) 주위에 한계를 때 리콜 것 같습니다. 이 접근 방식을 사용하면 고려해야 할 사항입니다.

나는이 코드가 많은 이유가 있는데, Where-clause에서 많은 수의 ID를 전달하지만 리팩토링이 필요한 코드 섹션이라고 생각합니다. 고맙게도, 유스 케이스는 한 번에 질문을받은 소수의 ID 만 보았습니다.

0

매개 변수화 된 목록을 varchar로 사용하는 저장 프로 시저로 쿼리를 구성 할 수도 있습니다. 예를 들어, SQL 서버에서 :

CREATE PROCEDURE dbo.[procedure_name] 

     @IN_LIST VARCHAR(MAX) 
    AS 
    BEGIN 

     DECLARE @SQL VARCHAR(MAX) 
     SET @SQL = ' 
      SELECT last_name, 
       first_name, 
       middle_initial 
      FROM names 
      WHERE last_name IN (' + @IN_LIST + ')' 

     EXECUTE(@SQL) 
    END 

@IN_LIST가 작은 따옴표와 쉼표가 포함 된 문자열로 포맷되었는지 확인하십시오. 자바 예를 들면 : 당신은 MS SQL 서버를 사용하는 경우

String inList = "'smith','jones','brown'"; 
0

, UDF를 사용하도록 TSQL을 바꿀 시도, 어쩌면 this 내 게시물이 당신에게

관련 문제