Comment faire plusieurs conditions CASE WHEN à l'aide de SQL Server 2008?


173

Ce que j'essaie de faire, c'est d'utiliser plus d'une condition CASE WHEN pour la même colonne.

Voici mon code pour la requête:

   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)

Cependant, ce que je veux faire, c'est utiliser plus d'un WHEN pour la même colonne "qty".

Comme dans le code suivant:

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

8
Y a-t-il quelque chose case when <condition> then <vaue> when <condition> then <value> . . . endqui ne fonctionne pas?
Gordon Linoff

1
Comme le disait @GordonLinoff, vous pouvez en avoir plus d'un WHEN.
Kermit le

C'est exactement comme tu le dis. J'avais mis une parenthèse au mauvais endroit. Désolé les gars!
Nils Anders

Réponses:


390

Il existe deux formats d'expression de cas . Vous pouvez faire CASEavec beaucoup WHENcomme;

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

Ou une CASEexpression simple

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

Ou à l' CASE intérieur CASE comme;

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
IL Y EN A DEUX. Liste trois : D
d8aninja

Le cas intérieur est-il validé si le cas extérieur ne renvoie pas vrai?
ggderas

3
@ d8aninja Ils n'en ont énuméré que 2. Le troisième est une combinaison des deux premiers, le boîtier extérieur étant le premier type et le boîtier intérieur étant le deuxième type.
avion en avion le

12

Utilisez simplement celui-ci, vous devez en utiliser plus quand ce sont des cours.

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

Vous pouvez utiliser l'exemple ci-dessous de cas avec plusieurs conditions.

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

Cela peut être un moyen efficace d'effectuer différents tests sur une seule instruction

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

cela ne fonctionne que sur les comparaisons d'égalité!


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
Il n'est pas nécessaire d'imbriquer des expressions CASES comme celle-ci, vous pouvez avoir plusieurs clauses WHEN dans un seul CASE.
Barmar le

2
Lorsque la première condition est remplie, les autres conditions sont ignorées?
dim

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
Veuillez formater votre réponse et éventuellement ajouter des explications.
tmt

0

J'avais un similaire mais il s'agissait de dates. Requête pour afficher tous les éléments du mois dernier, fonctionne très bien sans conditions jusqu'en janvier. Pour que cela fonctionne correctement, vous devez ajouter une variable année et mois

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)

Maintenant, je viens d'ajouter la variable en condition: ...

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

0

Combiner toutes les conditions

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

Quelque chose comme ça, deux conditions, deux colonnes

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

C'est juste que vous avez besoin de plusieurs Whenpour qu'un seul cas se comporte commeif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.