2012-07-31 3 views
3

내 변수 중 하나에 입력을 얻고 기본적으로 내가는 WHERE 절

SELECT * FROM PEOPLE 
WHERE 
    IF @INPUT = 1 
     ITEMID = 16 OR ITEMID = 13 
    ELSE IF @INPUT = 2 
     ITEMID = 11 OR ITEMID = 14 
    ELSE 
     ITEMID = 0 

같은 것을하고 싶지이 할 수있는 방법이 있나요에 입력을 평가하는 방법, 용서하십시오 잘못되었지만 가능한 한 쉽게 이해할 수 있도록 내 문제를 묘사하고 싶었습니다.

내가 이런

WHERE 
    CASE @INPUT 
     WHEN 1 THEN ITEMID = 16 OR ITEMID = 13 
     WHEN 2 THEN ITEMID = 11 OR ITEMID = 14 
     ELSE ITEMID = 0 
    END 

그러나 이러한 방법의 모든 오류가 발생하기 전에 CASE로 시도, 나는 좋은 조언, 가능하면이 작업을 수행하는 더 효율적인 방법을 부탁드립니다.

도움 주셔서 감사합니다.

+0

일반적으로 쿼리의 ID를 하드 코딩하지 않으려합니다. 13, 16 또는 11과 14에 대해 특별한 것이 있습니까? 그것들은 스스로 범주 또는 그룹이 될 수 있습니까? 아마도 테이블에 요소 그룹을 식별하는 새로운 열이 있어야 할 것입니다. 이렇게하면 쿼리를 그렇게 단순화 할 수 있습니다. 유지 보수 측면에서 생각해보십시오. 실제로 하드 코딩 된 ID를 유지하려고합니까? –

답변

6
WHERE (@INPUT = 1 AND ITEMID IN (13,16)) 
    OR (@INPUT = 2 AND ITEMID IN (11,14)) 
    OR (@INPUT NOT IN (1,2) AND ITEMID = 0) 
+1

놀랍게도 휴대 전화에 입력하는 것이 어려웠습니다. – LittleBobbyTables

1

그냥 다른 대답을하는 ..

WHERE (@INPUT in (1,2) AND ITEMID+2*@INPUT IN (15,18)) 
OR (@INPUT NOT IN (1,2) AND ITEMID = 0) 

또는

WHERE (@INPUT in (1,2) AND ITEMID IN (15-2*@INPUT,18-2*@INPUT)) 
OR (@INPUT NOT IN (1,2) AND ITEMID = 0) 

작품 @input = 1 때 이유는

  • if ITEMID = 13, ITEMID + 2*1 = 15
  • if ITEMID = 16, ITEMID + 2*1 = 18

@input = 2 :

  • if ITEMID = 11, ITEMID + 2*2 = 15
  • if ITEMID = 14, ITEMID + 2*2 = 18

하지만 의도적으로 코드를 모호하지 않으려면이를 사용해서는 안됩니다!

+1

작동하지만 - 지금부터 8 개월 후에 코드를 유지 보수/수정하려고 노력하십시오 .... *조차도 * 해당 코드가 모두 무엇인지 기억하지 못할 것입니다 ..... –

+2

따라서 결코 사용해서는 안되는 내 의견, 방금 추가 한 두 번째 옵션 (아마도 덜 읽기 쉽지만)은 아마 더 효율적입니다 :) – AlexDev

+1

@marc_s와 동의하지만, 성능이 문제이고이 트릭이 도움이된다면 왜 사용되지 않는지는 알 수 없습니다 빠른 대안이 없다면. * 그러나 * 이런 종류의 코드는 주석 처리되어야합니다 ** (예를 들어, 필터의 더 읽기 쉬운 버전이 후속 관리자에게 아이디어를 제공하도록 지정 될 수 있습니다). –

0

문제를 너무 혼란스럽게하지 말아야 할 것입니다.하지만 제 생각에 코리 (Cory)가 새로운 칼럼을 제안 할 때 옳은 길을 가고 있다고 지적 하겠지만, 당신은 항상 그 칼럼을 가지고 있지 않다는 것을 이해할 수 있습니다. 데이터 구조를 자유롭게 변경할 수 있습니다.

그러나 데이터 구조를 변경할 수없는 경우 작업 할 완벽한 구조가있는 것처럼 SELECT 문을 사용하는 것이 좋습니다.

이렇게하려면 필자가 WHERE 절이나 SELECT 절에서 참조 할 수있는 추가 파생 열을 추가하는 데 APPLY를 사용하는 경향이 있습니다.

예 :

SELECT 
    * 
FROM People p 
    CROSS APPLY (
     SELECT 
      CASE 
       WHEN p.ItemID IN (13,16) THEN 1 
       WHEN p.ItemID IN (11,14) THEN 2 
       ELSE 0 
      END  AS ItemCode 
    ) pInfo 
WHERE 
    @Input = pInfo.ItemCode 

하지만 실제로는 그냥 CROSS을 사용하는 것과 같이 너무 많이 적용됩니다.

이것은 조건부 논리를 다시 사용하려는 경우 (예 : SELECT pInfo.ItemCode 또는 GROUP BY pInfo.ItemCode을 추가하는 등) 한 곳에서 모두 포함된다는 이점이 있습니다.

또한 Cory가 언급 한 열을 추가하면 ItemCode 데이터를 사용하는 쿼리의 모든 위치가 이미 작성한 새로운 구조에 맞게 최적화됩니다.