SQL Server中的CASE语句不支持OR


Answers:


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语句中处理“或”。来吧微软时间从玩具数据库状态成长。
Rich Bianco

1
“不能在案例陈述中处理“或””。hmmm ....我不认为香港专业教育学院见过任何开关接受任何语言的“或”。似乎无法实现转换的目的。案例中哪些语言接受“或”?
Heriberto Lugo

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
支持-此响应确实增加了价值。它更适合OP的问题,如果您想嵌套一些CASE-WHENS,则此语法会大大减少必要的代码。
马特·肯普

1
@Leigh,我很感谢这个答案。将所有不同的格式都放在一个线程中非常好,并使其更可用作参考。
杰森·惠勒

3
@Bigwheels-哇..这是前一段时间。我可能不同意,因为从逻辑上讲,它与其他响应完全相同。就是说,您和马特提出了正确的观点。如果问题是“ 使用OR的正确语法是什么”,则提供了答案。但是,如果目标是“减少必要的语法”,则可接受的响应会更紧凑。顺便说一句,这并不是对达伦的回答的抨击,这是完全正确的。我的$ 0.02 :)
Leigh

2
使用IN关键字是更好的方法
Sagar Naliyapara '17


53

您可以使用WHEN拥有的一种表达方式,但不能将两者混合使用。

  1. 当when_expression

    是使用简单CASE格式时与input_expression进行比较的简单表达式。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)。


37

关于的已经有很多答案CASE。我将解释何时以及如何使用CASE

您可以在SQL查询中的任何位置使用CASE表达式。CASE表达式可以在SELECT语句,WHERE子句,Order by子句,HAVING子句,Insert,UPDATE和DELETE语句中使用。

CASE表达式具有以下两种格式:

  1. 简单的CASE表达式

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

    这会将一个表达式与一组简单表达式进行比较以找到结果。该表达式将一个表达式与每个WHEN子句中的表达式进行比较以实现等效性。如果WHEN子句中的表达式匹配,则将返回THEN子句中的表达式。

    这是OP的问题所在。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表达式的SELECT语句

--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表达式的ORDER BY子句

-- 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
为什么不解释在这里做什么?给出完整的答案很重要,因为一些新手可能需要用它来理解这是如何解决问题的
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 =要对其执行操作的表的名称。

column_name =要设置其值的列/字段的名称。

update_value =您要设置的值 column_name


11
尽管此代码可以解决OP的问题,但对未来的读者来说,几句话的解释将更加有帮助。
2015年

-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 '16

4
请不要发布裸露的代码,也不要提供您的代码在做什么的解释。
乔纳森·梅
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.