SQL Server: СЛУЧАЙ, КОГДА ИЛИ ТОЛЬКО КОНЕЦ => ИЛИ не поддерживается - PullRequest
541 голосов
/ 30 марта 2011

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

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

Ответы [ 10 ]

1036 голосов
/ 30 марта 2011

Этот формат требует, чтобы вы использовали либо:

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 
238 голосов
/ 05 апреля 2012
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 
56 голосов
/ 30 марта 2011
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
49 голосов
/ 09 июля 2014

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

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

    Простое выражение, с которым сравнивается выражение input_expression при использовании простого формата CASE. when_expression - любое допустимое выражение. Типы данных input_expression и каждого when_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).

36 голосов
/ 10 августа 2016

Уже есть много ответов относительно 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
    

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

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)

Надеюсь, что эти варианты использования помогут кому-то в будущем.

Источник

33 голосов
/ 30 марта 2011

Попробуйте

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
27 голосов
/ 25 февраля 2015
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;
3 голосов
/ 15 января 2018
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts
3 голосов
/ 19 августа 2015
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

0 голосов
/ 30 ноября 2016
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 
...