¿Cómo hago varias condiciones CASO CUANDO con SQL Server 2008?


173

Lo que intento hacer es usar más de una condición CASO CUANDO para la misma columna.

Aquí está mi código para la consulta:

   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)

Sin embargo, lo que quiero hacer es usar más de uno CUANDO para la misma columna "cantidad".

Como en el siguiente código:

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

8
¿Hay algo en eso case when <condition> then <vaue> when <condition> then <value> . . . endque no funciona?
Gordon Linoff el

1
Como decía @GordonLinoff, puedes tener más de uno WHEN.
Kermit

Es exactamente como tú dices. Había puesto un paréntesis en el lugar equivocado. ¡Lo siento chicos!
Nils Anders

Respuestas:


390

Hay dos formatos de expresión de casos . Puedes hacer CASEcon muchos WHENcomo;

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

O una CASEexpresión simple

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

O CASE dentro de CASE como;

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
HAY DOS. Listas tres : D
d8aninja

¿Se valida el caso interno si el caso externo no devuelve verdadero?
ggderas

3
@ d8aninja Solo enumeraron 2. El tercero es una combinación de los dos primeros, siendo la carcasa exterior el primer tipo y la carcasa interior el segundo tipo.
volando el

12

Solo usa este, tienes que usar más cuando son clases.

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

Puede usar el siguiente ejemplo de caso cuando tiene múltiples condiciones.

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

Esta puede ser una forma eficiente de realizar diferentes pruebas en una sola declaración

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

¡Esto solo funciona en comparaciones de igualdad!


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

55
No es necesario anidar expresiones CASES como esta, puede tener varias cláusulas WHEN en un solo CASE.
Barmar

2
Cuando se cumple la primera condición, ¿se ignora el resto de las condiciones?
Dom

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
Por favor, formatee su respuesta y posiblemente agregue alguna explicación.
tmt

0

Tuve un similar pero se trataba de fechas. Consulta para mostrar todos los artículos del último mes, funciona muy bien sin condiciones hasta enero. Para que funcione correctamente, necesitaba agregar una variable de año y mes

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)

Ahora solo agrego la variable en condición: ...

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

0

Combinando todas las condiciones

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

Algo así, dos condiciones, dos columnas

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

Es solo que necesitas múltiples Whenpara que un solo caso se comporte comoif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.