OR non è supportato con l'istruzione CASE in SQL Server


Risposte:


1079

Tale formato richiede l'utilizzo di:

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 

Altrimenti, utilizzare:

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

9
Nel secondo caso, perché funziona solo "IN" e non "="?
Han,

25
=funzionerebbe se si stesse confrontando con un singolo valore. Tuttavia, (22978, 23218, 23219)è un array ed INè necessario per abbinare solo uno dei valori.
LdTrigger

2
Questo puzza davvero-t-sql non può gestire una "o" in un'istruzione case. Dai Microsoft, è ora di crescere dallo stato del database dei giocattoli.
Rich Bianco

1
"non riesco a gestire un" o "in un'istruzione case" .. hmmm .... non credo di aver mai visto un interruttore accettare un "o" in qualsiasi lingua. sembrerebbe sconfiggere lo scopo di un interruttore. quali lingue accettano "o" in un caso?
Heriberto Lugo,

2
@Heriberto Lugo Non so quante lingue conosci ma ce ne sono almeno alcune. VB.NET e C # possono usarli con una semplice separazione virgola. Non sconfigge nulla in quanto ti salverà dal ripetere lo stesso codice in più casi per niente.
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 

38
votato - questa risposta aggiunge valore. Si adatta più da vicino alla domanda del PO e se si desidera nidificare CASE-WHENS questa sintassi riduce considerevolmente il codice necessario.
Matt Kemp,

1
@Leigh apprezzo questa risposta. È bello avere tutti i diversi formati in un thread e lo rende più utilizzabile come riferimento.
Jason Wheeler,

3
@Bigwheels - Wow .. questo era un po 'di tempo fa. Probabilmente non sono d'accordo perché, logicamente, è esattamente lo stesso di altre risposte . Detto questo, tu e Matt fate punti validi. Se la domanda era "qual è la sintassi corretta usando solo OR ", questo fornisce una risposta. Tuttavia, se l'obiettivo era "ridurre la sintassi necessaria", la risposta accettata è più compatta. A proposito, non è uno schianto sulla risposta di Darren, che è perfettamente valido. Solo i miei $ 0,02 :)
Leigh

2
usare la INparola chiave è un modo molto migliore
Sagar Naliyapara,

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

53

Puoi usare una delle espressioni che ha QUANDO, ma non puoi mescolarle entrambe.

  1. QUANDO quando_espressione

    Espressione semplice con cui viene confrontato input_expression quando viene utilizzato il formato CASE semplice. when_expression è qualsiasi espressione valida. I tipi di dati di input_expression e ciascuno di when_expression devono essere uguali o devono essere una conversione implicita.

  2. QUANDO Boolean_expression

    L'espressione booleana viene valutata quando si utilizza il formato CASE cercato. Boolean_expression è qualsiasi espressione booleana valida.

Puoi programmare:

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

Ma in ogni caso puoi aspettarti che la classifica variabile verrà confrontata in un'espressione booleana.

Vedi CASE (Transact-SQL) (MSDN).


37

Ci sono già molte risposte riguardo a CASE. Spiegherò quando e come utilizzare CASE.

È possibile utilizzare espressioni CASE ovunque nelle query SQL. Le espressioni CASE possono essere utilizzate nelle istruzioni SELECT, clausole WHERE, clausole Order by, clausole HAVING, Insert, UPDATE e DELETE.

Un'espressione CASE ha i seguenti due formati:

  1. Espressione CASE semplice

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

    Questo confronta un'espressione con un insieme di espressioni semplici per trovare il risultato. Questa espressione confronta un'espressione con l'espressione in ciascuna clausola WHEN per equivalenza. Se l'espressione all'interno della clausola WHEN viene abbinata, verrà restituita l'espressione nella clausola THEN.

    È qui che sta cadendo la domanda del PO. 22978 OR 23218 OR 23219non otterrà un valore uguale all'espressione ie ebv.db_no. Ecco perché sta dando un errore. I tipi di dati di input_expression e ciascuno di when_expression devono essere uguali o devono essere una conversione implicita.

  2. Espressioni CASE cercate

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

    Questa espressione valuta un insieme di espressioni booleane per trovare il risultato. Questa espressione consente operatori di confronto e operatori logici AND / OR con in ogni espressione booleana.

Dichiarazione 1.SELECT con espressioni CASE

--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. Istruzione aggiornata con espressione CASE

-- 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. ClausolaORDER BY con espressioni CASE

-- 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 Clause con espressione CASE

-- 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)

Spero che questi casi d'uso possano aiutare qualcuno in futuro.

fonte


34

Provare

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END

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;

1
Esecuzione dell'upgrade a causa dell'inclusione di un ELSE Salescampo, che restituisce il valore predefinito se non incluso in un'istruzione case, appropriato per le query aziendali.
FoxDeploy,

3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

1
Perché non spieghi cosa si sta facendo qui? È importante dare risposte complete con le spiegazioni poiché alcuni neofiti potrebbero averne bisogno per capire come questo risolva il problema
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 = Il nome della tabella su cui si desidera eseguire l'operazione.

column_name = Il nome della colonna / campo di cui si desidera impostare il valore.

update_value = Il valore che si desidera impostare column_name


11
Sebbene questo codice possa risolvere il problema del PO, alcune parole di spiegazione sarebbero ancora più utili per i futuri lettori.
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 

1
Questa risposta sembra non avere nulla a che fare con la domanda.
LarsTech,

4
Si prega di non pubblicare codice non elaborato, fornire anche una spiegazione di cosa sta facendo il codice.
Jonathan Mee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.