OR wird mit der CASE-Anweisung in SQL Server nicht unterstützt

572

Der OROperator in der WHENKlausel einer CASEAnweisung wird nicht unterstützt. Wie kann ich das machen?

CASE ebv.db_no 
    WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500' 
    ELSE 'WECS 9520' 
END as wecs_system 
Werner
quelle
SQL Standard erlaubt mehrere Werte: stackoverflow.com/a/54562580/5070879
Lukasz Szozda

Antworten:

1079

Für dieses Format müssen Sie entweder Folgendes verwenden:

CASE ebv.db_no 
  WHEN 22978 THEN 'WECS 9500' 
  WHEN 23218 THEN 'WECS 9500'  
  WHEN 23219 THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

Andernfalls verwenden Sie:

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
OMG Ponys
quelle
9
Warum funktioniert im zweiten Fall nur 'IN' und nicht '='?
Han
25
=würde funktionieren, wenn Sie mit einem einzelnen Wert vergleichen würden. Ist (22978, 23218, 23219)jedoch ein Array und INmuss nur mit einem der Werte übereinstimmen.
LdTrigger
2
Das stinkt wirklich - t-sql kann kein "oder" in einer case-Anweisung verarbeiten. Kommen Sie zu Microsoft, um aus dem Status der Spielzeugdatenbank erwachsen zu werden.
Rich Bianco
1
"kann nicht mit einem" oder "in einer case-Anweisung umgehen" .. hmmm .... ich glaube nicht, dass ich jemals einen Schalter gesehen habe, der ein "oder" in irgendeiner Sprache akzeptiert. scheint den Zweck eines Schalters zu vereiteln. Welche Sprachen akzeptieren "oder" in einem Fall?
Heriberto Lugo
2
@Heriberto Lugo Ich weiß nicht, wie viele Sprachen du kennst, aber es gibt mindestens einige. VB.NET und C # können sie mit einfacher Kommatrennung verwenden. Es besiegt nichts, da es Sie davor bewahrt, denselben Code in mehreren Fällen umsonst zu wiederholen.
Johnny Prescott
249
CASE
  WHEN ebv.db_no = 22978 OR 
       ebv.db_no = 23218 OR
       ebv.db_no = 23219
  THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Darren
quelle
38
upvoted - diese Antwort bietet Mehrwert. Es passt besser zur Frage des OP, und wenn Sie einige CASE-WHENS verschachteln möchten, reduziert diese Syntax den erforderlichen Code erheblich.
Matt Kemp
1
@Leigh Ich schätze diese Antwort. Es ist schön, all die verschiedenen Formate in einem Thread zu haben und macht es als Referenz benutzerfreundlicher.
Jason Wheeler
3
@ Bigwheels - Wow .. das war vor einer Weile. Ich war wahrscheinlich anderer Meinung, weil es logischerweise genau das gleiche ist wie andere Antworten . Das heißt, Sie und Matt machen gültige Punkte. Wenn die Frage lautete: "Was ist die richtige Syntax, wenn nur ODER verwendet wird? ", Gibt dies eine Antwort. Wenn jedoch "Reduzieren der erforderlichen Syntax" das Ziel war, ist die akzeptierte Antwort kompakter. Übrigens ist es kein Slam auf Darrens Antwort, was vollkommen gültig ist. Nur meine $ 0.02 :)
Leigh
2
Verwendung von INKeyword ist viel besseren Weg
Sagar Naliyapara
57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Cade Roux
quelle
53

Sie können einen der Ausdrücke von WHEN verwenden, aber Sie können nicht beide mischen.

  1. WANN wenn_Ausdruck

    Ist ein einfacher Ausdruck, mit dem input_expression verglichen wird, wenn das einfache CASE-Format verwendet wird. when_expression ist ein gültiger Ausdruck. Die Datentypen von input_expression und jeder when_expression müssen identisch sein oder eine implizite Konvertierung sein.

  2. WENN Boolescher_Ausdruck

    Wird der Boolesche Ausdruck ausgewertet, wenn das gesuchte CASE-Format verwendet wird? Boolean_expression ist ein gültiger Boolescher Ausdruck.

Sie könnten programmieren:

1.

    CASE ProductLine
            WHEN 'R' THEN 'Road'
            WHEN 'M' THEN 'Mountain'
            WHEN 'T' THEN 'Touring'
            WHEN 'S' THEN 'Other sale items'
            ELSE 'Not for sale'

2.

    CASE
            WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
            WHEN ListPrice < 50 THEN 'Under $50'
            WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
            WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
            ELSE 'Over $1000'
          END

In jedem Fall können Sie jedoch erwarten, dass die Variablenrangfolge in einem booleschen Ausdruck verglichen wird.

Siehe CASE (Transact-SQL) (MSDN).

Alfaplus
quelle
37

Es gibt bereits viele Antworten in Bezug auf CASE. Ich werde erklären, wann und wie man es benutzt CASE.

Sie können CASE-Ausdrücke überall in den SQL-Abfragen verwenden. CASE-Ausdrücke können in den Anweisungen SELECT, WHERE, Order by, HAVING, Insert, UPDATE und DELETE verwendet werden.

Ein CASE-Ausdruck hat die folgenden zwei Formate:

  1. Einfacher CASE-Ausdruck

    CASE expression
    WHEN expression1 THEN Result1
    WHEN expression2 THEN Result2
    ELSE ResultN
    END

    Dies vergleicht einen Ausdruck mit einer Reihe einfacher Ausdrücke, um das Ergebnis zu finden. Dieser Ausdruck vergleicht einen Ausdruck mit dem Ausdruck in jeder WHEN-Klausel für die Äquivalenz. Wenn der Ausdruck in der WHEN-Klausel übereinstimmt, wird der Ausdruck in der THEN-Klausel zurückgegeben.

    Hier fällt die Frage des OP. 22978 OR 23218 OR 23219erhält keinen Wert, der dem Ausdruck ie ebv.db_no entspricht. Deshalb gibt es einen Fehler. Die Datentypen von input_expression und jeder when_expression müssen identisch sein oder eine implizite Konvertierung sein.

  2. Gesuchte CASE-Ausdrücke

    CASE
    WHEN Boolean_expression1 THEN Result1
    WHEN Boolean_expression2 THEN Result2
    ELSE ResultN
    END

    Dieser Ausdruck wertet eine Reihe von booleschen Ausdrücken aus, um das Ergebnis zu finden. Dieser Ausdruck ermöglicht Vergleichsoperatoren und logische Operatoren AND / OR mit in jedem Booleschen Ausdruck.

1.SELECT-Anweisung mit CASE-Ausdrücken

--Simple CASE expression: 
SELECT FirstName, State=(CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

-- Searched CASE expression:
SELECT FirstName,State=(CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

2. Update-Anweisung mit CASE-Ausdruck

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

3.ORDER BY-Klausel mit CASE-Ausdrücken

-- Simple CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Gender WHEN 'F' THEN LastName END ASC

-- Searched CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE WHEN Gender='M' THEN FirstName END Desc,
 CASE WHEN Gender='F' THEN LastName END ASC

4.Having-Klausel mit CASE-Ausdruck

-- Simple CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE Gender WHEN 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE Gender WHEN 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

-- Searched CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE WHEN Gender = 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE WHEN Gender = 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

Hoffe, dass diese Anwendungsfälle jemandem in Zukunft helfen werden.

Quelle

Somnath Muluk
quelle
34

Versuchen

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
JNK
quelle
28
SELECT
  Store_Name,
  CASE Store_Name
    WHEN 'Los Angeles' THEN Sales * 2
    WHEN 'San Diego' THEN Sales * 1.5
    ELSE Sales
    END AS "New Sales",
  Txn_Date
FROM Store_Information;
Archu
quelle
1
Upvoting aufgrund der Aufnahme eines ELSE SalesFelds, das den Standardwert zurückgibt, wenn er nicht in einer case-Anweisung enthalten ist, die für Geschäftsanfragen geeignet ist.
FoxDeploy
3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts
Debendra Dash
quelle
1
Warum erklären Sie nicht, was hier gemacht wird? Es ist wichtig, vollständige Antworten mit Erklärungen zu geben, da einige Neulinge dies möglicherweise benötigen, um zu verstehen, wie dies das Problem löst
Gerhard Barnard
3
UPDATE table_name 
  SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
END

table_name = Der Name der Tabelle, für die Sie eine Operation ausführen möchten.

column_name = Der Name der Spalte / des Felds, dessen Wert Sie festlegen möchten.

update_value = Der Wert, den Sie einstellen möchten column_name

Anand Agrawal
quelle
11
Während dieser Code das Problem des OP lösen kann, wären einige erklärende Worte für zukünftige Leser noch hilfreicher.
Thom
-5
Select s.stock_code,s.stock_desc,s.stock_desc_ar,
mc.category_name,s.sel_price,
case when s.allow_discount=0 then 'Non Promotional Item' else 'Prmotional 
item' end 'Promotion'
From tbl_stock s inner join tbl_stock_category c on s.stock_id=c.stock_id
inner join tbl_category mc on c.category_id=mc.category_id
where mc.category_id=2 and s.isSerialBased=0 
Mohammad Shahnawaz
quelle
1
Diese Antwort scheint nichts mit der Frage zu tun zu haben.
LarsTech
4
Bitte posten Sie keinen bloßen Code, sondern erläutern Sie auch, was Ihr Code tut.
Jonathan Mee