LUB nie jest obsługiwany z instrukcją CASE w SQL Server

572

OROperatora w WHENklauzuli CASEoświadczenie nie jest obsługiwany. W jaki sposób mogę to zrobić?

CASE ebv.db_no 
    WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500' 
    ELSE 'WECS 9520' 
END as wecs_system 
Werner
źródło
Standard SQL pozwala na wiele wartości: stackoverflow.com/a/54562580/5070879
Łukasz Szozda

Odpowiedzi:

1079

Ten format wymaga użycia:

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 

W przeciwnym razie użyj:

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Kucyki OMG
źródło
9
W drugim przypadku, dlaczego działa tylko „IN”, a nie „=”?
Han
25
=działałoby, gdybyś porównywał do pojedynczej wartości. Jednak (22978, 23218, 23219)jest tablicą i INkonieczne jest, aby dopasować tylko jedną z wartości.
LdTrigger
2
To naprawdę śmierdzi - t-sql nie może obsłużyć „lub” w instrukcji case. Przyjdź na czas firmy Microsoft, aby wyrosnąć ze statusu bazy danych zabawek.
Rich Bianco,
1
„nie mogę obsłużyć” lub „w instrukcji case”… hmmm… nie sądzę, żebym kiedykolwiek widział przełącznik, który akceptuje „lub” w dowolnym języku. wydaje się, że pokonałby cel zmiany. jakie języki akceptują „lub” w przypadku?
Heriberto Lugo
2
@Heriberto Lugo Nie wiem, ile znasz języków, ale jest ich co najmniej kilka. VB.NET i C # mogą używać ich z prostą separacją przecinków. Niczego nie pokonuje, ponieważ uratuje cię od powtarzania tego samego kodu w wielu przypadkach za darmo.
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
źródło
38
pozytywnie oceniany - ta odpowiedź wnosi wartość dodaną. Dokładniej pasuje do pytania OP, a jeśli chcesz zagnieździć niektóre CASE-WHENS, ta składnia znacznie zmniejsza potrzebny kod.
Matt Kemp,
1
@Leigh Doceniam tę odpowiedź. Miło jest mieć wszystkie różne formaty w jednym wątku i sprawia, że ​​jest on bardziej użyteczny jako odniesienie.
Jason Wheeler,
3
@Bigwheels - Wow .. to było jakiś czas temu. Prawdopodobnie się nie zgodziłem, ponieważ logicznie jest dokładnie tak samo, jak inne odpowiedzi . To powiedziawszy, ty i Matt robicie ważne punkty. Jeśli pytanie brzmiało „jaka jest poprawna składnia przy użyciu tylko OR ”, to daje odpowiedź. Jeśli jednak celem było „ograniczenie niezbędnej składni”, akceptowana odpowiedź jest bardziej zwarta. BTW, to nie jest trzask odpowiedzi Darrena, która jest całkowicie poprawna. Tylko moje 0,02 $ :)
Leigh
2
użycie INsłowa kluczowego jest znacznie lepszym sposobem
Sagar Naliyapara,
57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Cade Roux
źródło
53

Możesz użyć jednego z wyrażeń WHEN, ale nie możesz mieszać obu z nich.

  1. KIEDY kiedy_wyrażenie

    Jest prostym wyrażeniem, do którego porównywane jest wyrażenie_wejściowe, gdy używany jest prosty format CASE. wyrażenie_czasu jest dowolnym poprawnym wyrażeniem. Typy danych wyrażenia wejściowego i każdego wyrażenia when muszą być takie same lub muszą być konwersją niejawną.

  2. KIEDY wyrażenie logiczne

    Czy wyrażenie logiczne jest oceniane podczas korzystania z przeszukiwanego formatu CASE. Wyrażenie boolowskie to dowolne prawidłowe wyrażenie boolowskie.

Możesz zaprogramować:

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

Ale w każdym razie można oczekiwać, że ranking zmiennych zostanie porównany w wyrażeniu logicznym.

Zobacz CASE (Transact-SQL) (MSDN).

Alfaplus
źródło
37

Istnieje już wiele odpowiedzi w odniesieniu do CASE. Wyjaśnię, kiedy i jak korzystać CASE.

Możesz używać wyrażeń CASE w dowolnym miejscu zapytań SQL. Wyrażeń CASE można używać w instrukcjach SELECT, klauzulach WHERE, klauzulach Sortuj według, klauzul HAVING, instrukcjach Insert, UPDATE i DELETE.

Wyrażenie CASE ma następujące dwa formaty:

  1. Proste wyrażenie CASE

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

    To porównuje wyrażenie do zestawu prostych wyrażeń, aby znaleźć wynik. To wyrażenie porównuje wyrażenie do wyrażenia w każdej klauzuli WHEN pod kątem równoważności. Jeśli wyrażenie w klauzuli WHEN jest dopasowane, wyrażenie w klauzuli THEN zostanie zwrócone.

    To tutaj spada pytanie PO. 22978 OR 23218 OR 23219nie otrzyma wartości równej wyrażeniu tj. ebv.db_no. Dlatego daje błąd. Typy danych wyrażenia wejściowego i każdego wyrażenia when muszą być takie same lub muszą być konwersją niejawną.

  2. Szukano wyrażeń CASE

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

    To wyrażenie ocenia zestaw wyrażeń boolowskich w celu znalezienia wyniku. To wyrażenie pozwala operatorom porównania oraz operatorom logicznym AND / OR z każdym wyrażeniem logicznym.

1. Instrukcja SELECT z wyrażeniami 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. Instrukcja aktualizacji z wyrażeniem 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. Klauzula ORDER BY z wyrażeniami 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. Klauzula z wyrażeniem 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)

Mam nadzieję, że te przypadki użycia pomogą komuś w przyszłości.

Źródło

Somnath Muluk
źródło
34

Próbować

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
JNK
źródło
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
źródło
1
Uaktualnianie z powodu włączenia ELSE Salespola, które zwraca wartość domyślną, jeśli nie jest zawarte w instrukcji case, odpowiednie dla zapytań biznesowych.
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
źródło
1
Dlaczego nie wyjaśniacie, co się tutaj robi? Ważne jest, aby udzielić kompletnych odpowiedzi z Objaśnieniami, ponieważ niektórzy nowicjusze mogą tego potrzebować, aby zrozumieć, jak to rozwiązuje problem
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 = Nazwa tabeli, na której chcesz wykonać operację.

column_name = Nazwa kolumny / pola, której wartość chcesz ustawić.

update_value = Wartość, którą chcesz ustawić column_name

Anand agrawal
źródło
11
Chociaż ten kod może rozwiązać problem PO, kilka słów wyjaśnienia byłoby jeszcze bardziej przydatne dla przyszłych czytelników.
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
źródło
1
Ta odpowiedź wygląda na to, że nie ma to nic wspólnego z pytaniem.
LarsTech
4
Nie publikuj samego kodu, wyjaśnij też, co robi Twój kod.
Jonathan Mee