2017-10-24 12 views
0

내가 작업하고있는 쿼리의 표현은 다음과 같습니다.WHERE 절에 CASE 문을 중첩하고 여러 값을 반환하는 방법

SELECT T1.Col3 
FROM Table1 T1 
WHERE T1.Col1 IN ('Value1','Value2') 
    AND (CASE 
      WHEN T1.Col1 = 'Value1' 
       THEN T1.Col2 IN ('Value3','Value4','Value5') 
      WHEN T1.Col1 = 'Value2' 
       THEN T1.Col2 IN ('Value6','Value7','Value8') 
      END 
     ) 

어떤 이유로 든 두 번째 구문에서 항상 오류가 발생합니다. 두 IN 문에서 첫 번째 쉼표에서는 구문 오류가 발생하지만 두 번째 문에서는 구문 오류가 발생합니다. 그게 아니라면 메이크업 변화해야한다는, 나는 또한 다음과 같은 OR 문 문에 중첩 변경 시도 :

THEN (T1.COL2 = 'Value3') OR (T1.COL2 = 'Value4') OR (T1.COL2 = 'Value5') 

대신 내가 처음 OR 문 주위에 구문 오류가 발생합니다.

이전에 WHERE 절에서 CASE를 사용했지만 하나의 값만 반환했습니다. 첫 번째 쉼표 또는 OR 문에서 구문 오류가 발생한다는 사실로 인해 다중 값을 반환 할 수 없다고 생각됩니다.

이 문제에 관해 알려줄 수있는 조명을 알려 주시면 대단히 감사하겠습니다.

P. temp 테이블을 만들고 조건부 DELETE 문을 실행하여 이미 위의 CASE 문으로 수행하려는 것과 동일한 결과를 얻는 방법으로 이미 작업을 수행하고 있습니다. 그러나이 질문에 대한 다른 방법이 가능한지 알고 싶다면 궁금합니다.

답변

2

아래처럼 WHERE 기준을 단순화 할 수 있습니다 :

같은 쿼리가 UNION와 2 개 개의 별도 쿼리로 기록 될 수
SELECT T1.Col3 
FROM Table1 T1 
WHERE 
(
    (T1.Col1 = 'Value1' AND T1.Col2 IN ('Value3','Value4','Value5')) 
    OR 
    (T1.Col1 = 'Value2' AND T1.Col2 IN ('Value6','Value7','Value8')) 
) 

: 그러나

SELECT T1.Col3 
FROM Table1 T1 
WHERE T1.Col1 = 'Value1' 
AND T1.Col2 IN ('Value3','Value4','Value5') 

UNION -- note that this will return distinct results 

SELECT T1.Col3 
FROM Table1 T1 
WHERE T1.Col1 = 'Value2' 
AND T1.Col2 IN ('Value6','Value7','Value8') 

참고하는 WHEREOR와 절을 값 비싼 쿼리 계획이 발생할 수 있습니다. 쿼리가 매우 비싼 경우이 쿼리에 대한 커버링 인덱스는 도움이 될 수 있습니다 :

CREATE INDEX IX_Table1_Col1_Col2_Incl ON Table1 (Col1, Col2) INCLUDE (Col3) 
1
Select col3 
From tab 
Where col1 = 'val1' and col2 in ('val3', 'val4') or 
      col1 = 'val2' and col2 in ('val5', 'val6')