2014-06-13 1 views
0

데이터베이스 행에 부분 데이터를 일치시키려는 함수가 있습니다. 매개 변수가 null이 아닌 경우 일치 항목을 찾고 싶습니다. null 인 경우는 그 파라미터를 무시할 필요가있다. 매개 변수 중 하나에 값이 있지만 일치하는 것이 없으면 쿼리는 행을 반환하지 않습니다. 의사에서지정된 경우 함수 매개 변수의 필터를 사용하여 선택

, 즉이 가고 싶어하는 방법을 꽤 많이있다 :

get all rows where: 
    param_a matches col_a when param_b is not null else don't check this column 
    AND param_b matches col_b when param_b is not null else don't check this column 
    AND param_c matches col_c when param_c is not null else don't check this column 
    AND param_d matches col_d when param_d is not null else don't check this column 
    AND param_e matches col_e when param_e is not null else don't check this column 

내가 지금 당장 :

SELECT * FROM table 
WHERE nvl(param_a, col_a) = col_a 
AND nvl(param_b, col_b) = col_b 
AND nvl(param_c, col_c) = col_c 
AND nvl(param_d, col_d) = col_d; 

기타 ... 그것은 작동하지만, 나는 그것이 확실하지 않다 최선의 선택. 동료는이 웹 응용 프로그램에서 자동 완성 기능에 사용되기 때문에 내가

SELECT * FROM table 
WHERE (param_a = col_a or param_a is null) 
AND (param_b = col_b or param_b is null) 
AND (param_c = col_c or param_c is null) 
AND (param_d = col_d or param_d is null); 

를 사용하는 쿼리는 사용자 유형으로, 많이 실행 제안했다. 빠른 것은 필수적입니다. 가장 엄격한 열을 먼저 필터링하여 처리 할 행 수를 줄입니다.

이러한 옵션 중 어느 것이 좋습니까? 그렇지 않다면 어떻게 할 것입니까?

편집 : 나는 일반적인 질문이지만 문맥에 넣어야한다 :이 경우는 주소이다. param_a은 실제로 우편 번호입니다. param_b 거리 이름 등 ...이 함수는 사용자가 쓰는 문자열 (예 : 999 Random St, Fakestate, Countryland, 131ABD)을 가져 와서 분할하려고하는 프로 시저를 호출하고 다음을 포함하는 테이블을 반환합니다. 주소, 도시, 국가 등 ... select 문 (질문의 주제)에 사용됩니다.

답변

1

입력 속도를 높이려면 다음 방법을 제안하십시오. 매개 변수의 각 조합에 대해 별도의 쿼리를 만듭니다. 이 같은 where 조항과, 24 개 쿼리의 총입니다 : 다음

WHERE param_a = col_a 
WHERE param_b = col_b 
. . . 
WHERE param_a = col_a and param_b = col_b 
. . . 
WHERE param_a = col_a and param_b = col_b and param_c = col_c and param_d = col_d 

,이 스물 네 쿼리를 미리 컴파일.

그런 다음 매개 변수의 현재 상태를 기반으로 적절한 쿼리를 선택하십시오.

또한 최소한 인덱스를 추가합니다 :

table(param_a, param_b, param_c, param_d) 
table(param_b, param_c, param_d, param_a) 
table(param_c, param_d, param_a, param_b) 
table(param_d, param_a, param_b, param_c) 

이 적어도 하나 개의 매개 변수를 사용하여 모든 경우를 커버합니다. 다른 매개 변수에 대해 다른 색인을 포함하고자 할 수 있습니다.

2

저는 두 번째 해결책이 더 좋습니다. 그것은 오라클이 colA/B/C/D를 평가하는 것을 건너 뛸 수있게합니다. 해당 매개 변수는 null입니다.

그러나 동적으로 쿼리를 작성하는 경우 더 빠르고 명확합니다.

whereClause = 'WHERE 1 = 1' 
IF paramA is not null 
then whereClause += ' AND param_a = col_a' 
else if paramB is not null 
then whereClause += ' AND param_b = col_b' 
etc... 

인덱스 나는 것에만 인덱스 일반적으로 사용되는 열 조합의 경우 :

는 SQL 또는 프로그래밍 언어 중 하나를 예를 들어, 당신은 같은 것을 할 수 있습니다. 그들 모두를 다룰 수있는 조합이 너무 많습니다. 당신에게 가장 큰 돈을주는 것들을 선택하십시오.

관련 문제