2016-06-03 2 views
-4

CASE 문을 포함하는 WHERE 절을 수행하려고합니다. 필자의 필드가 특정 텍스트 값과 같으면 별도의 값을 포함하는 경우 한 세트의 논리를 적용한 다음 다른 방식으로 필터링하려고합니다.WHERE 절 내에서 SQL CASE 문

는이 코드를 가지고 있지만 나는 그것이 작동 할 수 없습니다 :

AND CASE DO11_DOCUM_MG36 WHEN 'TSC-ORDINE-RIC' 
               THEN 
               (CONVERT(DATE,ISNULL(dbo.DO31_DOCCORPOORD.DO31_DATACONS,DATEADD(day,ISNULL(dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4,15),dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)),102) <= '2016-02-29' AND dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF is not null) AND (dbo.DO36_DOCCORPOEST.DO36_DATAST1 is null or CONVERT(DATE,dbo.DO36_DOCCORPOEST.DO36_DATAST1,102) >= '2016-02-01') 
               ELSE 
               (CONVERT(DATE,ISNULL(dbo.DO31_DOCCORPOORD.DO31_DATACONS,DATEADD(day,ISNULL(dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4,15),dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)),102) BETWEEN '2016-02-01' AND '2016-02-29' AND dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF is not null) 
               END 

감사

+0

무엇이 문제입니까? – MusicLovingIndianGirl

+0

DO31_DATACONS 또는 DO17_NUMPERS4에 무엇이 있습니까? – LukStorms

+0

Sintax가 '<'근처에서 올바르지 않다고 말합니다. – user3348353

답변

0

나는 다르게 읽기 쉽게 만들기 위해이 포맷했습니다. CASE 문의 논리는 CASE WHEN ... THEN ... ELSE ... END 여야합니다. WHEN 문에 AND 절을 넣을 수는 있지만 사용자가 THEN 절에서 AND를 사용할 수 있다는 것을 알지 못합니다.

WHEN 문은 boolian 값을 생성하지 않으며 'WHEN x = y THEN'에는 'WHEN x THEN'이 없습니다.

진술 시작 부분에 CASE와 WHEN 사이에 아무 것도 입력하지 않아야합니다. 이는 결코 작동하지 않습니다.

테이블 별칭을 사용하기 시작하면 코드를 훨씬 쉽게 읽을 수 있습니다.

AND CASE DO11_DOCUM_MG36 
     WHEN 'TSC-ORDINE-RIC' 
      THEN (
        CONVERT(DATE, ISNULL(dbo.DO31_DOCCORPOORD.DO31_DATACONS, DATEADD(day, ISNULL(dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4, 15), dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)), 102) <= '2016-02-29' 
        AND dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF IS NOT NULL 
        ) 
       AND (
        dbo.DO36_DOCCORPOEST.DO36_DATAST1 IS NULL 
        OR CONVERT(DATE, dbo.DO36_DOCCORPOEST.DO36_DATAST1, 102) >= '2016-02-01' 
        ) 
     ELSE (
       CONVERT(DATE, ISNULL(dbo.DO31_DOCCORPOORD.DO31_DATACONS, DATEADD(day, ISNULL(dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4, 15), dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)), 102) BETWEEN '2016-02-01' 
        AND '2016-02-29' 
       AND dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF IS NOT NULL 
       ) 
     END 

CASE 문 논리는 다음과 같이 읽어야합니다.

CASE 
    WHEN a.Field1 = 'SomeText' 
     THEN CONVERT(DATE, a.DateTimeField) 
    WHEN a.Field1 = 'DifferentText' AND a.Field2 = 'YetMoreText' 
     THEN CONVERT(DATE, a.DifferentDateTimeField) 
    ELSE 'DoSomethingElse' 
END 

일부 추가 읽기;

http://www.techonthenet.com/sql_server/functions/case.php

논리 읽기, 나는이 당신을 할 것 같은 당신이 전혀 여기에 뭔가를 case 문을 필요로 확신하고 있지 않다;

AND 
    (
     CONVERT(DATE, ISNULL(dbo.DO31_DOCCORPOORD.DO31_DATACONS, DATEADD(day, ISNULL(dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4, 15), dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)), 102) <= '2016-02-29' 
     AND dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF IS NOT NULL 
    ) 
AND 
    (   
     (
     dbo.DO36_DOCCORPOEST.DO36_DATAST1 IS NULL 
     OR CONVERT(DATE, dbo.DO36_DOCCORPOEST.DO36_DATAST1, 102) >= '2016-02-01' 
     ) 
     OR   
     CONVERT(DATE, ISNULL(dbo.DO31_DOCCORPOORD.DO31_DATACONS, DATEADD(day, ISNULL(dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4, 15), dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)), 102) BETWEEN '2016-02-01'AND '2016-02-29' 
    ) 

귀하의 의견에 따르면, 이것을 사용할 수 있습니다.

AND (
     ( OrderType = 'TSC-ORDINI-RIC' 
      AND 
      'WHERE CONDITION 1 GOES HERE' 
     ) 
     OR 
     ( OrderType = 'TSC-ORDINI' 
      AND 
      'WHERE CONDITION 2 GOES HERE' 
     ) 
    ) 
+0

리치 덕분에 비록 내가 모든 AND 제거 할 경우에만 변환 (DATE, ISNULL (dbo.DO31_DOCCORPOORD.DO31_DATACONS, DATEADD (일, ISNULL (dbo.DO17_DOCTESTAPERS.DO17_NUMPERS4, 15), dbo.DO12_DOCTESTARIF.DO12_DATAVSCONF)), 102) <= '2016-02-29'는 아직 주석 처리 된 sintax 오류를 출력합니다. – user3348353

+0

사례 명세서에 잘못된 점은 무엇입니까? 이 인스턴스에서 사례 명세서가 필요하지 않은지 확실하지 않습니다. 사례없이 –

+0

답변을 업데이트 할 예정입니다. 주문 유형이 TSC-ORDINI-RIC 일 때 사용해야합니다. 주문이 TSC-ORDINI 일 때 어디 조건이 다른지를 사용해야합니까? – user3348353