문제

쿼리를 만들어야 할 요구 사항이있었습니다 SQL 서버 검색 조건에 사용자 입력에 따라 테이블이 포함/제외되는 경우.

두 개의 테이블이 있다고 말합니다. TABLE_A 그리고 TABLE_B 열이 있습니다 KEYCOLUMN_A 그리고 COLUMN_A 안에 TABLE_A 그리고 열 FKCOLUMN_B 그리고 COLUMN_B 안에 TABLE_B.

그리고 다음과 같은 쿼리.

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'

이제 사용자가 입력하지 않은 경우 SEARCH2, 검색 할 필요가 없습니다 TABLE_B. 그러나 이것은 의미합니다 IF ELSE 절. 쿼리의 "선택적"테이블의 수가 증가함에 따라 순열 및 조합도 증가하고 많은 것들이 있습니다. IF 그리고 ELSE 진술.

대신 나는 그 진술을 그대로 유지하기로 결정했습니다. 그래서 만약 SEARCH2 비어 있으면 쿼리가 효과적으로됩니다.

SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '% %'

SQL Optimizer가 그것을 인식 할 수 있습니까? LIKE %% 조건 자체를 제거하는 것만 큼 좋은가요?

도움이 되었습니까?

해결책

OR "B"테이블 주변 : 예 :

AND (len(searchString)=0 OR table_b.column_b LIKE "%searchString%" )

이런 식으로 문자열에 대한 값이 없다면 길이는 0이고 첫 번째 부분은 OR 평가 될 것입니다. 항상 사실로 돌아와서 방정식 부분을 유효한 것으로 반환하고 다른 절반을 사용하여 사용합니다. LIKE 절.

필요한 링크 테이블과 동일하게 적용 할 수 있습니다.

다른 팁

첫째, 예에 공간이 있습니다.

AND TABLE_B.COLUMN_B LIKE '% %'

그것은 실제로 중요한 조건이기 때문에 결코 최적화되지 않을 것입니다.

이제 최적화되면 데이터베이스 엔진에 따라 다르고 얼마나 똑똑한 지 생각합니다.

예를 들어, SQL Server 2005 MySQL 5.0.38은 두 가지 유형의 쿼리에 대해 동일한 실행 계획을 제공합니다.

Where 절과 함께 사용하여 와일드 카드를 사용하여 레코드를 검색, 업데이트 및 삭제하기 위해 사용됩니다.

예시:

직원 이름이 문자 'A'에서 출연 한 모든 레코드를 검색하려면 :

select * from Employee where Name like 'a%'

이름으로 모든 레코드를 업데이트합니다 amit 직원 이름은 캐릭터 'a'로 시작합니다.

update Employee set Name='amit' where Name like 'a%'

직원 이름이 문자 'a'로 시작하는 모든 레코드를 삭제하려면 :

delete from Employee  where Name like 'a%'

유사 연산자는 WHERE 절에서 사용하여 열에서 지정된 패턴을 검색합니다.

LIKE '%[p-s]'  -- "It search data from table parameter where sentence ending with p,q,r,s word."
LIKE '[0-9]' --It use for search only numeric value
LIKE '%table%' -- it use for search parameter from table where use "table" keyword'.
LIKE %[^p-r]  -- it set the condition where Not Ending With a Range of Characters

Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
        LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
        WHERE T1.BrandName LIKE '%Samsung%'
Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
        LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
        WHERE T1.BrandName LIKE '%[a-j]'

~ 안에 MySQL Ilike를 사용할 수 있으며 케이스는 둔감합니다.

다음과 같이 쿼리를 다시 작성할 수 있습니다.

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND (@paramA='' or TABLE_A.COLUMN_A LIKE '%' + @paramA + '%')
AND (@paramB='' or TABLE_B.COLUMN_B LIKE '%' + @paramB + '%')

이런 식으로, Parama 또는 Paramb이 ''인 경우 동일한 괄호 안에 쿼리 된 다른 열은 쿼리되지 않습니다.

노조와 적절한 조인을 사용하십시오.

% foo % 검색어는 믹스에 또는 Len을 추가하지 않고 충분히 나쁘다 (색인을 사용할 수 없음).

SELECT
    TABLE_A.*
FROM
    TABLE_A
    JOIN
    TABLE_B On TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
WHERE
    TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'
UNION
SELECT
    TABLE_A.*
FROM
    TABLE_A
WHERE
    TABLE_A.COLUMN_A LIKE '%SEARCH%'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top