607 Stimmen

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

El OR Operator in der WHEN Klausel einer CASE Anweisung wird nicht unterstützt. Wie kann ich dies tun?

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

1116voto

OMG Ponies Punkte 312816

Für dieses Format müssen Sie entweder:

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

270voto

Darren Punkte 2657
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

60voto

Cade Roux Punkte 85601
CASE WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
 ELSE 'WECS 9520' 
END as wecs_system

56voto

Alfaplus Punkte 1675

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

  1. WHEN wenn_Ausdruck

    Ist ein einfacher Ausdruck, mit dem input_expression verglichen wird, wenn das einfache CASE-Format verwendet wird. when_expression ist ein beliebiger gültiger Ausdruck. Die Datentypen von input_expression und jedem when_expression müssen gleich sein oder es muss sich um eine implizite Konvertierung handeln.

  2. WHEN Boolescher_Ausdruck

    Wird der boolesche Ausdruck bei Verwendung des gesuchten CASE-Formats ausgewertet. Boolean_expression ist ein beliebiger 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

Aber in jedem Fall können Sie davon ausgehen, dass die Rangfolge der Variablen in einem booleschen Ausdruck verglichen wird.

Siehe CASE (Transact-SQL) (MSDN).

39voto

Somnath Muluk Punkte 51007

Es gibt bereits eine Vielzahl von Antworten auf folgende Fragen CASE . Ich werde erklären, wann und wie man CASE .

Sie können CASE-Ausdrücke überall in den SQL-Abfragen verwenden. CASE-Ausdrücke können in der SELECT-Anweisung, den WHERE-Klauseln, der Order-by-Klausel, den HAVING-Klauseln sowie den Anweisungen 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

    Dabei wird ein Ausdruck mit einer Reihe von einfachen Ausdrücken verglichen, um das Ergebnis zu ermitteln. Dieser Ausdruck vergleicht einen Ausdruck mit dem Ausdruck in jeder WHEN-Klausel auf Gleichwertigkeit. Wenn der Ausdruck in der WHEN-Klausel übereinstimmt, wird der Ausdruck in der THEN-Klausel zurückgegeben.

    Genau hier setzt die Frage des Auftraggebers an. 22978 OR 23218 OR 23219 erhält keinen Wert, der dem Ausdruck ebv.db_no entspricht. Deshalb wird ein Fehler ausgegeben. Die Datentypen von input_expression und jedem when_expression müssen gleich sein oder es muss sich um eine implizite Konvertierung handeln.

  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 ermitteln. Dieser Ausdruck erlaubt Vergleichsoperatoren und die logischen Operatoren AND/OR 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. aktualisierte 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. die 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. nach einer 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)

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

Quelle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X