SQL Server 中的 CASE 语句不支持 OR
Posted
技术标签:
【中文标题】SQL Server 中的 CASE 语句不支持 OR【英文标题】:OR is not supported with CASE Statement in SQL Server 【发布时间】:2011-07-26 03:57:37 【问题描述】:不支持CASE
语句的WHEN
子句中的OR
运算符。我该怎么做?
CASE ebv.db_no
WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500'
ELSE 'WECS 9520'
END as wecs_system
【问题讨论】:
SQL 标准允许多个值:***.com/a/54562580/5070879 【参考方案1】:试试
CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
【讨论】:
【参考方案2】:CASE WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500'
ELSE 'WECS 9520'
END as wecs_system
【讨论】:
【参考方案3】:该格式要求您使用以下任一格式:
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
【讨论】:
对于第二种情况,为什么只有'IN'起作用而'='不起作用? 如果您要与单个值进行比较,=
会起作用。但是,(22978, 23218, 23219)
是一个数组,IN
是仅匹配其中一个值所必需的。
这真的很臭 - t-sql 无法处理 case 语句中的“或”。来吧微软时间从玩具数据库状态成长。
“无法处理 case 语句中的“或””.. 嗯....我认为我从未见过开关接受任何语言的“或”。似乎会破坏开关的目的。哪些语言接受“或”的情况?
@Heriberto Lugo 我不知道你知道多少种语言,但至少有几种。 VB.NET 和 C# 可以通过简单的逗号分隔来使用它们。它不会破坏任何东西,因为它可以让您免于在多种情况下重复相同的代码。【参考方案4】:
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
【讨论】:
赞成 - 此响应确实增加了价值。它更符合 OP 的问题,如果你想嵌套一些 CASE-WHENS,这种语法会大大减少必要的代码。 @Leigh 我很欣赏这个答案。很高兴在一个线程中包含所有不同的格式,并使其更可用作参考。 @Bigwheels - 哇……这是不久前的事了。我可能不同意,因为从逻辑上讲,它与other responses 完全相同。也就是说,你和马特提出了有效的观点。如果问题是“使用 OR only 的正确语法是什么”,这提供了一个答案。但是,如果“减少必要的语法”是目标,accepted response 会更紧凑。顺便说一句,这不是对达伦的回答的抨击,这是完全有效的。只是我的 0.02 美元 :) 使用IN
关键字更好【参考方案5】:
您可以使用 WHEN 具有的表达式之一,但不能同时使用它们。
WHEN when_expression
是一个简单表达式,当使用简单 CASE 格式时与 input_expression 进行比较。 when_expression 是任何有效的表达式。 input_expression 和每个when_expression 的数据类型必须相同或者必须是隐式转换。
WHEN 布尔表达式
是使用搜索的 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)。
【讨论】:
【参考方案6】: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;
【讨论】:
赞成,因为包含ELSE Sales
字段,如果没有包含在 case 语句中,则返回默认值,适用于业务查询。【参考方案7】:
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
【讨论】:
虽然这段代码可能会解决 OP 的问题,但几句话的解释会对以后的读者更有帮助。【参考方案8】:关于CASE
,已经有很多答案了。我将解释何时以及如何使用CASE
。
您可以在 SQL 查询中的任何位置使用 CASE 表达式。 CASE 表达式可以在 SELECT 语句、WHERE 子句、Order by 子句、HAVING 子句、Insert、UPDATE 和 DELETE 语句中使用。
CASE 表达式有以下两种格式:
简单的 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 的数据类型必须相同或者必须是隐式转换。
搜索到的 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表达式的Having子句
-- 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)
希望这个用例将来能对某人有所帮助。
Source
【讨论】:
【参考方案9】: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
【讨论】:
这个答案看起来与问题无关。 请不要发布裸代码,同时解释你的代码在做什么。【参考方案10】:select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender
from contacts
【讨论】:
你为什么不解释这里正在做什么?用解释给出完整的答案很重要,因为一些新手可能需要这样才能理解这是如何解决问题的【参考方案11】: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
【讨论】:
以上是关于SQL Server 中的 CASE 语句不支持 OR的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中的 case 语句中寻找解决方案
我想使用 CASE 语句来更新 sql server 2005 中的一些记录
SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]