SQL中CASE语句执行不符合预期,如何实现逐行判断?
问题解答
为什么代码1报错?
代码1里的子查询(select S.PersonID from Sales.Customer as S)会返回Sales.Customer表中所有行的PersonID值,而CASE语句的WHEN条件只能接收单个值,因此抛出「Subquery returned more than 1 value」错误。
为什么代码2能逐行判断?
代码2的CASE直接引用当前行的ProductCategoryId字段:每次处理production.productcategory的一行数据时,就用该行的ProductCategoryId值匹配WHEN条件,天然是逐行判断的逻辑。
能不能让代码1逐行检查S.PersonID是否为空?
可以,但需要让子查询和Sales.SalesOrderDetail的当前行关联,确保子查询只返回当前行对应的单个PersonID值;或者通过JOIN关联两张表,直接引用关联后的字段。
修改后的代码示例
方式1:关联子查询(保留CASE子查询形式)
select OrderQty as 'OrderQty', case when (select S.PersonID from Sales.Customer as S where S.CustomerID = SOD.CustomerID) is null then 1 else 2 end as 'CaseResult' from sales.SalesOrderDetail as SOD
通过S.CustomerID = SOD.CustomerID让子查询仅返回当前订单明细对应客户的PersonID,保证子查询只输出单个值。
方式2:JOIN关联表(更高效直观)
select SOD.OrderQty as 'OrderQty', case when S.PersonID is null then 1 else 2 end as 'CaseResult' from sales.SalesOrderDetail as SOD left join Sales.Customer as S on S.CustomerID = SOD.CustomerID
通过LEFT JOIN关联两张表,直接引用关联后的S.PersonID,逻辑和代码2完全一致,逐行判断当前行关联客户的PersonID是否为空。
内容的提问来源于stack exchange,提问作者Ham
相关产品推荐
相关产品推荐

