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
Nils Anders
la source
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
Kaf
la source
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)
Shankar
la source
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
Abhijeet Navgire
la source
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é!

user2082785
la source
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
Jimoc
la source
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 
wennykikkok
la source
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)
Douglas Bentley
la source
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 )                 
    )
Arun Prasad ES
la source
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
Ricardo Roa
la source
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
Himanshu Ahuja
la source