2017-12-07 6 views
0

WHERE 절에 CASE WHEN 조건이있는 함수가 있습니다. 간단하게 (매우 간단)는 다음과 같습니다 및 원조인덱싱 된 열이있는 WHERE 절에서 "CASE WHEN"

SELECT * 
FROM mytable t 
WHERE (
    CASE aPARAM WHEN 'a' THEN t.a = aID 
       WHEN 'b' THEN t.b = aID 
       WHEN 'c' THEN t.c = aID 
       ELSE TRUE END 
) 

aPARAM - 테이블의 인덱스 컬럼 "MYTABLE - 기능

, BC에게

를 PARAMS "

그러나이 경우 MySQL은 인덱스를 전혀 사용하지 않습니다.

예,이 쿼리에는 다른 조건을 선택하는 조건이 있지만 결과 값에 의존하지 않으며 쿼리를 실행하기 전에 계산할 수 있습니다.

인덱스를 사용하기 위해이 함수에 제안 할 수있는 것은 무엇입니까?

답변

1

사례는 MySQL이 색인을 사용할 수없는 표현식입니다. 이 케이스를 or 조건과 같이 변환 해보세요.

SELECT * 
FROM mytable t 
WHERE (t.a = aID and aPARAM = 'a') 
or (t.b = aID and aPARAM = 'b') 
or (t.c = aID and aPARAM = 'c') 
or (aPARAM not in ('a','b','c')) 
+0

완벽한 !!! 이 변형을 사용했지만 마지막 조건을 놓쳤습니다. 감사. – Vitaly