You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:55:19