SQL Server:CASE WHEN或THEN ELSE END => OR不受支持

CASE语句的WHEN子句中的OR不受支持。 我该怎么做?

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

这种格式要求您使用:

 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 
 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 
 CASE WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' ELSE 'WECS 9520' END as wecs_system 

您可以使用WHEN具有的expression式之一,但不能混合使用这两个expression式。

  1. 何时when_expression

    是使用简单CASE格式时比较input_expression的简单expression式。 when_expression是任何有效的expression式。 input_expression和每个when_expression的数据types必须相同或者必须是隐式转换。

  2. 何时布尔expression式

    使用search的CASE格式时,布尔expression式是否被计算。 Boolean_expression是任何有效的布尔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 

但是在任何情况下,你都可以期望variables排名将在布尔expression式中进行比较。

请参阅CASE(Transact-SQL) (MSDN)。

尝试

 CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END 
 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; 

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

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

CASEexpression式有以下两种格式:

  1. 简单的CASEexpression式

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

    这将一个expression式与一组简单的expression式进行比较以find结果。 该expression式将expression式与每个WHEN子句中的expression式进行对比。 如果WHEN子句中的expression式匹配,则返回THEN子句中的expression式。

    这是OP的问题正在下降的地方。 22978 OR 23218 OR 23219将不会得到等于expression式的值,即ebv.db_no。 这就是为什么它给错误。 input_expression和每个when_expression的数据types必须相同或者必须是隐式转换。

  2. searchCASEexpression式

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

    该expression式计算一组布尔expression式来查找结果。 该expression式允许在每个布尔expression式中使用比较运算符和逻辑运算符AND / OR。

1. CASEexpression式的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.用CASEexpression式更新语句

 -- 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.带有CASEexpression式的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 

有CASEexpression式的条款

 -- 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) 

希望这个用例在将来可以帮助别人。

资源

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