Wie mache ich mehrere CASE WHEN-Bedingungen mit SQL Server 2008?

173

Ich versuche, mehr als eine CASE WHEN-Bedingung für dieselbe Spalte zu verwenden.

Hier ist mein Code für die Abfrage:

   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)

Ich möchte jedoch mehr als ein WANN für dieselbe Spalte "Menge" verwenden.

Wie im folgenden Code:

IF
// CODE
ELSE IF
// CODE
ELSE IF
// CODE
ELSE
// CODE
Nils Anders
quelle
8
Funktioniert etwas case when <condition> then <vaue> when <condition> then <value> . . . enddaran nicht?
Gordon Linoff
1
Wie @GordonLinoff sagte, können Sie mehr als eine haben WHEN.
Kermit
Es ist genau so, wie du sagst. Ich hatte eine Klammer an die falsche Stelle gesetzt. Tut mir leid, Leute!
Nils Anders

Antworten:

389

Es gibt zwei Formate für den Fallausdruck . Sie können CASEmit vielen WHENals tun ;

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

Oder ein einfacher CASEAusdruck

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

Oder CASE innerhalb CASE als;

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
quelle
30
ES GIBT ZWEI. Listen drei : D
d8aninja
Wird der innere Fall validiert, wenn der äußere Fall nicht true zurückgibt?
Ggderas
3
@ d8aninja Sie haben nur 2 aufgelistet. Der dritte ist eine Kombination der ersten beiden, wobei der äußere Fall der erste Typ und der innere Fall der zweite Typ ist.
fliegend
12

Verwenden Sie einfach diese. Sie müssen mehr verwenden, wenn es sich um Klassen handelt.

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
quelle
3

Sie können das folgende Beispiel für einen Fall verwenden, wenn mehrere Bedingungen vorliegen.

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
quelle
2

Dies kann eine effiziente Möglichkeit sein, verschiedene Tests für eine einzelne Anweisung durchzuführen

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

Dies funktioniert nur bei Gleichheitsvergleichen!

user2082785
quelle
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
quelle
5
Es ist nicht erforderlich, solche CASES-Ausdrücke zu verschachteln. Sie können mehrere WHEN-Klauseln in einem einzigen CASE haben.
Barmar
2
Wenn die erste Bedingung erfüllt ist, werden die restlichen Bedingungen ignoriert?
So
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
quelle
1
Bitte formatieren Sie Ihre Antwort und fügen Sie möglicherweise eine Erklärung hinzu.
tmt
0

Ich hatte ein ähnliches, aber es handelte sich um Daten. Die Abfrage, um alle Elemente für den letzten Monat anzuzeigen, funktioniert bis Januar ohne Bedingungen. Damit dies ordnungsgemäß funktioniert, muss eine Variable für Jahr und Monat hinzugefügt werden

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)

Jetzt füge ich einfach die Variable in Bedingung hinzu: ...

(year(CreationTime)=@yr and MONTH(creationtime)=@mth)
Douglas Bentley
quelle
0

Alle Bedingungen kombinieren

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
quelle
0

So etwas wie zwei Bedingungen, zwei Spalten

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
quelle
0

Es ist nur so, dass Sie mehrere Whenfür einen einzelnen Fall benötigen, um sich so zu verhaltenif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Himanshu Ahuja
quelle