SQL Server:CASE WHEN OREN ELSE END =>不支持OR

Wer*_*ner 556 sql t-sql sql-server case case-when

OR该在WHEN一个子句CASE语句不支持.我怎样才能做到这一点?

CASE ebv.db_no 
    WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500' 
    ELSE 'WECS 9520' 
END as wecs_system 
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 1063

该格式要求您使用以下任一种:

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 
Run Code Online (Sandbox Code Playgroud)

否则,使用:

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

  • 如果你要比较单个值,`=`就可以了.但是,`(22978,23218,23219)`是一个数组,只需匹配其中一个值就需要`IN`. (25认同)
  • 对于第二种情况,为什么只有'IN'工作而不是'='? (9认同)
  • 这真的很糟糕 - t-sql 无法处理 case 语句中的“或”。来吧微软从玩具数据库状态成长起来的时间。 (2认同)
  • “无法处理 case 语句中的“或”……嗯……我认为我从未见过开关接受任何语言中的“或”。似乎违背了转换的目的。什么语言在一个案例中接受“或”? (2认同)
  • @Heriberto Lugo我不知道您知道多少种语言,但至少有几种。VB.NET和C#可以通过简单的逗号分隔来使用它们。它不会打败任何东西,因为它将使您避免多次重复相同的代码而一无所获。 (2认同)

小智 244

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 
Run Code Online (Sandbox Code Playgroud)

  • upvoted - 这个回复确实增加了价值.它更接近于OP的问题,如果你想嵌套一些CASE-WHENS,这种语法会大大减少必要的代码. (38认同)
  • @Bigwheels-哇..这是前一段时间。我可能不同意,因为从逻辑上讲,它与[其他响应](http://stackoverflow.com/a/5487918/104223)完全相同。就是说,您和马特提出了正确的观点。如果问题是“使用OR * only *使用什么是正确的语法”,则提供了答案。但是,如果目标是“减少必要的语法”,则[可接受的响应](http://stackoverflow.com/a/5487936/104223)会更紧凑。顺便说一句,这并不是对达伦的回答的抨击,这是完全正确的。只是我的$ 0.02 :) (3认同)
  • 使用`IN`关键字是更好的方法 (2认同)

Cad*_*oux 57

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


Alf*_*lus 52

您可以使用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'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但无论如何,您可以预期变量排名将在布尔表达式中进行比较.

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

  • 加一:我没有意识到这个语法与单独的布尔表达式 (3认同)

Som*_*luk 36

已经有很多答案了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
    
    Run Code Online (Sandbox Code Playgroud)

    这会将表达式与一组简单表达式进行比较,以查找结果.此表达式将表达式与每个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
    
    Run Code Online (Sandbox Code Playgroud)

    此表达式计算一组布尔表达式以查找结果.此表达式允许在每个布尔表达式中使用比较运算符和逻辑运算符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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

带有CASE表达式的3.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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

希望这个用例将来有助于某人.

资源


JNK*_*JNK 34

尝试

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
Run Code Online (Sandbox Code Playgroud)


小智 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;
Run Code Online (Sandbox Code Playgroud)