2016-06-20 2 views
0

'WHERE'절 안에 case 문에 대한 다른 Q & A를 읽었지만 사용법을 제대로 이해할 수 없습니다. 아래에 코드 스 니펫을 게시 할 것입니다. 나는 case 문을 사용하는 방법에 관한 기본적인 원칙을 모르고 있으며, 이것이 코드가 컴파일/실행되지 않는 이유이다. 어떤 도움을 주셔서 감사합니다. i.LastShpd 내림차순SQL 사례 명세서 : Inside Where 절

에 의해

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case 
    When n.OnOrder IN ('0', '') 
    Then i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime))) 
    End) 

주문은 이미 적절한 문 'FROM' 'SELECT'을 가지고, 내가 위에서 무엇을 설명합니다. 이제 표시된 변수 (ecx LastShpd)를 기반으로 결과를 필터링하고 있습니다. case 서술문에서 수행하고자하는 작업은 다음과 같습니다. n.OnOrder = 0 일 때 i.OnOrder = 0 또는 i.LastShpd가 21 일보다 긴 행만 유지하려고합니다.

+1

끝 부분 뒤에 로직을 추가해야합니다. 케이스 n.OnOrder IN ('0', '') i.OnOrder = 0 또는 i.LastShpd damola

답변

3

난 당신이 이것에 대한 사례를 필요가 있다고 생각하지 않습니다

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
    (n.OnOrder IN ('0', '') and i.OnOrder = 0) 
or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime) 
    ) 

다시 읽는 어쩌면 질문하는 것은이 다른 방법입니다

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
    n.OnOrder Not IN ('0', '') 
    or i.OnOrder = 0 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime) 
    ) 
+1

훨씬 더 좋은 해결책입니다. 감사합니다. –

+0

@StevenDuncan - 기꺼이 도와주었습니다. 나는 Select 사이드에서 Where 사이드보다 CASE가 더 유용하다고 본다. – vercelli

1

WHERE 절 내에서 CASE를 사용하여, 당신은 여전히 ​​동작의 양측을 정의 할 필요가있다. (즉, [CASE CONDITION] = [SOMETHING]). 이 작업은 원하는 작업에 따라 까다로울 수 있지만 가장 쉬운 방법은 case 문을 true/false 유형의 조건으로 실행하여 [CASE] = 1 또는 [CASE] = 0이되도록하는 것입니다.

귀하의 경우에는

(우발적 인 말장난!) : 물론

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case 
    When n.OnOrder IN ('0', '') AND (i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)) 
    THEN 1 
    ELSE 0 
    End) = 1 

다른 답변이 지적한대로이 사건이 특정 인스턴스에서 정말 필요가 없습니다. 그러나 더 복잡한 조건이 있다면 도움이 될 수 있습니다.

+0

사례를 설명해 주셔서 감사합니다. 나는 당신이 그것을 평등하게 설정해야한다는 것을 깨닫지 못했습니다. 이것은 SQL을 계속 배우면서 도움이 될 것입니다. –

+0

@StevenDuncan WHERE 절에서 사용할 때만 비교하면됩니다. 당신은 또한'SELECT'에서'CASE'를 사용할 수 있습니다. 그러면 비교를 전혀하지 않을 것입니다. 흥미롭게도'ORDER BY'에서'CASE'를 사용하여 동적 순서를 지정할 수 있습니다. SQL을 구조화하는 방법은 특정 컨텍스트에 따라 다릅니다. – Joel