SQL Server 2008을 사용하여 여러 CASE WHEN 조건을 어떻게 수행합니까?


173

내가하려는 것은 동일한 열에 대해 둘 이상의 CASE WHEN 조건을 사용하는 것입니다.

다음은 쿼리에 대한 코드입니다.

   SELECT   Url='',
            p.ArtNo,
            p.[Description],
            p.Specification,
            CASE 
            WHEN 1 = 1 or 1 = 1 
               THEN 1 
               ELSE 0 
            END as Qty,
            p.NetPrice,
            [Status] = 0
      FROM  Product p (NOLOCK)

그러나 내가하고 싶은 것은 동일한 열 "qty"에 대해 둘 이상의 WHEN을 사용하는 것입니다.

다음 코드와 같이

IF
// CODE
ELSE IF
// CODE
ELSE IF
// CODE
ELSE
// CODE

8
약이 뭔가 case when <condition> then <vaue> when <condition> then <value> . . . end가 작동하지 않습니다?
Gordon Linoff

1
@GordonLinoff가 말했듯이 둘 이상을 가질 수 있습니다 WHEN.
Kermit

그것은 당신이 말하는 그대로입니다. 괄호를 잘못된 곳에 넣었습니다. 미안 해요!
Nils Anders

답변:


389

case expression의 두 가지 형식 이 있습니다 . 당신은 CASE많은 WHEN것으로 할 수 있습니다 ;

CASE  WHEN Col1 = 1 OR Col3 = 1  THEN 1 
      WHEN Col1 = 2 THEN 2
      ...
      ELSE 0 END as Qty

아니면 간단한 CASE표현

CASE Col1 WHEN 1 THEN 11 WHEN 2 THEN 21 ELSE 13 END

또는 CASE CASE 등;

CASE  WHEN Col1 < 2 THEN  
                    CASE Col2 WHEN 'X' THEN 10 ELSE 11 END
      WHEN Col1 = 2 THEN 2
      ...
      ELSE 0 END as Qty

30
두 가지가있다. 3 : D
d8aninja을 등록 함

외부 사례가 true를 반환하지 않으면 내부 사례의 유효성이 검사됩니까?
ggderas

3
@ d8aninja 2 개만 나열했습니다. 세 번째는 첫 번째 두 개를 조합 한 것으로, 외부 케이스는 첫 번째 유형이고 내부 케이스는 두 번째 유형입니다.
flygoing September

12

이것을 사용하십시오. 수업 일 때 더 많이 사용해야합니다.

SELECT   Url='',
         p.ArtNo,
         p.[Description],
         p.Specification,
         CASE 
         WHEN 1 = 1 or 1 = 1 
            THEN 1 
         WHEN 2 = 2
             THEN 2
         WHEN 3 = 3
              THEN 3
          ELSE 0 
        END as Qty,
        p.NetPrice,
        [Status] = 0
  FROM  Product p (NOLOCK)

3

여러 조건이있는 경우 아래 예를 사용할 수 있습니다.

SELECT
  id,stud_name,
  CASE
    WHEN marks <= 40 THEN 'Bad'
    WHEN (marks >= 40 AND
      marks <= 100) THEN 'good'
    ELSE 'best'
  END AS Grade
FROM Result

2

이것은 하나의 문장에서 다른 테스트를 수행하는 효율적인 방법 일 수 있습니다

select
case colour_txt 
  when 'red' then 5 
  when 'green' then 4 
  when 'orange' then 3
else 0 
end as Pass_Flag

이것은 평등 비교에서만 작동합니다!


1
    case when first_condition
      then first_condition_result_true
    else
      case when second_condition 
        then second_condition_result_true
      else
          second_condition_result_false                              
      end
    end
  end as qty

5
이와 같이 CASES 표현식을 중첩 할 필요가 없으며 단일 CASE에 여러 개의 WHEN 절을 가질 수 있습니다.
Barmar

2
첫 번째 조건이 충족되면 나머지 조건은 무시됩니까?
일요일

1
case 
    when a.REASONID in ('02','03','04','05','06') then
        case b.CALSOC 
            when '1' then 'yes' 
            when '2' then 'no' 
            else 'no' 
        end
    else 'no' 
end 

1
답을 형식화하고 설명을 추가하십시오.
tmt

0

나는 비슷했지만 날짜를 다루고있었습니다. 지난 달의 모든 항목을 표시하는 쿼리로, 1 월까지 조건없이 작동합니다. 제대로 작동하려면 연도 및 월 변수를 추가해야합니다.

declare @yr int
declare @mth int

set @yr=(select case when month(getdate())=1 then YEAR(getdate())-1 else YEAR(getdate())end)
set @mth=(select case when month(getdate())=1 then month(getdate())+11 else month(getdate())end)

이제 변수를 조건에 추가합니다. ...

(year(CreationTime)=@yr and MONTH(creationtime)=@mth)

0

모든 조건을 결합

select  a.* from tbl_Company a

where  a.Company_ID NOT IN (1,2)  

AND (   
        (0 = 
            CASE WHEN (@Fromdate = '' or @Todate='')
                THEN 0 
                ELSE 1  
            END
        )      -- if 0=0 true , if 0=1 fails (filter only when the fromdate and todate is present)
                OR
        (a.Created_Date between @Fromdate and @Todate )                 
    )

0

이 같은 두 조건 두 열

SELECT ITEMSREQ.ITEM AS ITEM,
       ITEMSREQ.CANTIDAD AS CANTIDAD,
       (CASE  WHEN ITEMSREQ.ITEMAPROBADO=1 THEN 'APROBADO'
              WHEN ITEMSREQ.ITEMAPROBADO=0 THEN 'NO APROBADO'
        END) AS ITEMS,
        (CASE 
              WHEN ITEMSREQ.ITEMAPROBADO = 0 
              THEN CASE WHEN REQUISICIONES.RECIBIDA IS NULL  THEN 'ITEM NO APROBADO PARA ENTREGA' END
              WHEN ITEMSREQ.ITEMAPROBADO = 1 
              THEN CASE WHEN REQUISICIONES.RECIBIDA IS NULL THEN 'ITEM AUN NO RECIBIDO' 
                        WHEN REQUISICIONES.RECIBIDA=1 THEN 'RECIBIDO' 
                        WHEN REQUISICIONES.RECIBIDA=0 THEN 'NO RECIBIDO' 
                       END
              END)
              AS RECIBIDA
 FROM ITEMSREQ
      INNER JOIN REQUISICIONES ON
      ITEMSREQ.CNSREQ = REQUISICIONES.CNSREQ

0

단지 When하나의 사례 가 여러 개로 작동 하려면 여러 개가 필요하다는 것입니다.if.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.