ИЛИ не поддерживается оператором CASE в SQL Server


572

ORОператор в WHENп о в CASEзаявлении не поддерживается. Как я могу это сделать?

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

Стандарт SQL допускает использование нескольких значений: stackoverflow.com/a/54562580/5070879
Лукаш Шозда,

Ответы:


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 не может обработать «или» в выражении case. Давай пора Microsoft вырасти из статуса игрушечной базы данных.
Рич Бьянко

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

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
upvoted - этот ответ добавляет ценность. Это более точно соответствует вопросу OP, и если вы хотите вложить несколько CASE-WHENS, этот синтаксис значительно уменьшает необходимый код.
Мэтт Кемп

1
@Leigh, я ценю этот ответ. Приятно иметь все разные форматы в одном потоке, что делает его более удобным для использования в качестве справочного материала.
Джейсон Уилер

3
@Bigwheels - Вау .. это было некоторое время назад. Я, вероятно, не согласен, потому что, по логике, это точно так же, как другие ответы . Тем не менее, вы и Мэтт делаете правильные очки. Если вопрос был «какой правильный синтаксис с использованием только ИЛИ », это дает ответ. Однако, если целью было «сокращение необходимого синтаксиса», принятый ответ более компактен. Между прочим, это не удар по ответу Даррена, который совершенно справедлив. Просто мои $ 0,02 :)
Ли

2
Использование INключевого слова намного лучше
Сагар Налиипара


53

Вы можете использовать одно из выражений WHEN, но вы не можете смешивать их оба.

  1. КОГДА когда_выражение

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

  2. WHEN 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 и каждого when_expression должны быть одинаковыми или неявным преобразованием.

  2. Искал CASE выражения

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

    Это выражение оценивает набор логических выражений, чтобы найти результат. Это выражение позволяет сравнивать операторы и логические операторы И / ИЛИ с каждым логическим выражением.

1. ВЫБРАТЬ оператор с выражениями 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.ORDER BY с выражениями 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поля, которое возвращает значение по умолчанию, если оно не включено в инструкцию case, подходящее для бизнес-запросов.
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.