АБО не підтримується оператором CASE у SQL Server


Відповіді:


1079

Цей формат вимагає використання будь-якого:

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 

В іншому випадку використовуйте:

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

9
У другому випадку, чому працює лише "IN", а не '='?
Хань

25
=працював би, якби ви порівнювали одне значення. Однак, (22978, 23218, 23219)це масив і INнеобхідно, щоб відповідати лише одному зі значень.
LdTrigger

2
Це справді смердюче, t-sql не може обробити "або" у заяві справи. Давай час Microsoft вирости зі статусу бази даних іграшок.
Багатий Б'янко

1
"не вдається обробити" або "у випадок". Хммм .... я не думаю, що я коли-небудь бачив перемикач приймати "чи" будь-якою мовою. здавалося б, переможе мету перемикання. які мови приймають "чи" у випадку?
Херіберто Луго

2
@Heriberto Lugo Я не знаю, скільки мов ви знаєте, але є принаймні кілька. VB.NET і C # можуть використовувати їх з простим розділенням комами. Це нічого не переможе, тому що позбавить вас від повторення одного і того ж коду в декількох випадках ні за що.
Джонні Прескотт

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
прихильне - ця відповідь додає значення. Це більше відповідає питанням ОП, і якщо ви хочете вкласти деякі випадки, коли цей синтаксис значно зменшує необхідний код.
Метт Кемп

1
@Leigh Я ціную цю відповідь. Приємно, щоб всі різні формати були в одній нитці і робили її більш корисною як орієнтир.
Джейсон Уілер

3
@Bigwheels - Нічого ... це було деякий час тому. Я, мабуть, не погодився, тому що, логічно, це точно так само, як і інші відповіді . Однак, ти з Меттом робиш дійсні бали. Якщо питання було "який правильний синтаксис використовується лише АБО ", це дає відповідь. Однак, якщо метою було зменшення необхідного синтаксису, прийнята відповідь є більш компактною. До речі, це не гріх на відповідь Даррена, що цілком справедливо. Просто мій $ 0,02 :)
Лі

2
Використовувати INключове слово набагато краще
Sagar Naliyapara


53

Ви можете використовувати один з виразів КОГО є, але ви не можете їх змішати.

  1. КОЛИ коли_вираз

    Це просте вираження, з яким порівнюється input_expression, коли використовується простий формат CASE. when_expression - будь-який дійсний вираз. Типи даних input_expression і кожен, коли_expression повинні бути однаковими або повинні бути неявними перетвореннями.

  2. КОЛИ Boolean_expression

    Чи оцінюється булевий вираз при використанні шуканого формату CASE. Boolean_expression - будь-який дійсний булевий вираз.

Ви можете програмувати:

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

Але в будь-якому випадку можна очікувати, що змінний рейтинг буде порівнюватися в булевому виразі.

Див. CASE (Transact-SQL) (MSDN).


37

Відповідей щодо цього вже багато CASE. Я поясню, коли і як користуватися CASE.

Ви можете використовувати вирази CASE в будь-якому місці SQL-запитів. Вирази CASE можуть використовуватися в операторі SELECT, WHERE, вказувати по пункту, порядок за пунктом, HAVING, клавіші Insert, UPDATE та DELETE.

Вираз CASE має такі два формати:

  1. Простий вираз CASE

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

    Це порівнює вираз із набором простих виразів, щоб знайти результат. Цей вираз порівнює вираз із виразом у кожному пункті WHEN щодо еквівалентності. Якщо вираз в рамках WHEN збігається, вираз у пункті THEN повернеться.

    Саме тут падає питання ОП. 22978 OR 23218 OR 23219не отримає значення, яке дорівнює виразу, тобто ebv.db_no. Ось чому він дає помилку. Типи даних input_expression і кожен, коли_expression повинні бути однаковими або повинні бути неявними перетвореннями.

  2. Пошукові вирази CASE

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

    Цей вираз оцінює набір булевих виразів, щоб знайти результат. Цей вираз дозволяє порівняти оператори та логічні оператори AND / OR з кожним булевим виразом.

1.SELECT оператор з виразами 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.Оновіть оператор з виразом 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. СЛУЧАЙ ПО ЗАДАННЯМИ з виразами 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. Виконання статті з виразом 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)

Сподіваюсь, такі випадки використання комусь допоможуть у майбутньому.

Джерело


34

Спробуйте

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
Оновлення через включення ELSE Salesполя, яке повертає значення за замовчуванням, якщо інше не включено до оператора справи, відповідного для бізнес-запитів.
FoxDeploy

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

1
Чому ви не поясните, що тут робиться? Важливо дати повні відповіді з поясненнями, оскільки це може знадобитися для новачків, щоб зрозуміти, як це вирішує проблему
Герхард Барнард

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 = Назва таблиці, над якою ви хочете виконати операцію.

column_name = Ім'я стовпця / поля, значення якого потрібно встановити.

update_value = Значення, яке ви хочете встановити column_name


11
Хоча цей код може вирішити проблему ОП, кілька пояснень будуть ще кориснішими для майбутніх читачів.
Том

-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
Ця відповідь, схоже, не має нічого спільного з питанням.
LarsTech

4
Будь ласка, не публікуйте голий код, а також поясніть, що робить ваш код.
Джонатан Мі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.