Як зробити декілька випадків, коли Умови використання SQL Server 2008?


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".

Як у наступному коді:

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

8
Щось з цього приводу case when <condition> then <vaue> when <condition> then <value> . . . endне працює?
Гордон Лінофф

1
Як казав @GordonLinoff, у вас може бути більше одного WHEN.
Керміт

Це саме так, як ви кажете. Я поставив дужки в неправильному місці. Вибачте, хлопці!
Нілс Андерс

Відповіді:


389

Існує два формати висловлювання регістру . Ви можете зробити 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
Є ДВА. Списки три : D
d8aninja

Чи підтверджується внутрішній випадок, якщо випадок не повертається правдою?
ggderas

3
@ d8aninja Вони перераховували лише 2. Третій - це комбінація перших двох, зовнішній корпус - перший тип, а внутрішній - другий.
проліт

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.
Бармар

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

У мене було подібне, але воно стосувалося побачень. Запит на показ усіх елементів за останній місяць чудово працює без умов до січня. Для того, щоб він працював правильно, потрібно додати змінну року та місяця

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.