%%와 함께 연산자처럼 SQL 사용
-
16-09-2019 - |
문제
쿼리를 만들어야 할 요구 사항이있었습니다 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%'