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

Oracle SQL Case语句子查询返回多行错误的解决办法

问题修复方案

错误原因

你的SQL报错是因为CASE表达式的每个分支必须返回单个标量值,但你在THEN里写的子查询(select distinct type_products from my_total_table where products = 'A')返回了多行数据(对应my_total_table里所有type_products为'A'的记录),违反了CASE的语法规则。

修复方案

根据你“返回对应分类所有产品”的需求,分两种场景处理:

场景1:返回所有符合条件的产品行(推荐)

直接通过条件过滤来获取对应分类的产品,不需要用CASE。假设你要查询指定用户(比如@current_user_email)的对应产品:

SELECT DISTINCT t.type_products, t.Name
FROM my_total_table t
WHERE 
    -- 判断用户是否属于类型'A',同时筛选'A'分类的产品
    EXISTS (
        SELECT 1 
        FROM my_table_1 u 
        WHERE u.users = @current_user_email 
          AND u.user_type = 'A'
    )
    AND t.type_products = 'A'
    -- 如果需要支持其他角色,可添加OR条件
    -- OR (
    --     EXISTS (
    --         SELECT 1 
    --         FROM my_table_1 u 
    --         WHERE u.users = @current_user_email 
    --           AND u.user_type = 'B'
    --     )
    --     AND t.type_products = 'B'
    -- )

场景2:将所有产品合并为单个字符串(一行展示)

如果需要把多个产品合并成一个字符串返回(比如用逗号分隔),可以用数据库对应的字符串聚合函数:

  • MySQL用GROUP_CONCAT
  • PostgreSQL用STRING_AGG
  • SQL Server用STRING_AGG

以MySQL为例:

SELECT 
    CASE 
        WHEN EXISTS (
            SELECT 1 
            FROM my_table_1 u 
            WHERE u.users = @current_user_email 
              AND u.user_type = 'A'
        )
        THEN GROUP_CONCAT(DISTINCT CONCAT(t.type_products, ' - ', t.Name) SEPARATOR ', ')
        ELSE NULL
    END AS product_list
FROM my_total_table t
WHERE t.type_products = 'A'

补充说明

原SQL的逻辑存在误区:你试图在SELECT的CASE里返回多行结果,这不符合SQL的行式输出规则。正确的做法是先判断用户角色,再筛选对应产品的行,或者聚合为单个字符串。

内容的提问来源于stack exchange,提问作者JB999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:57:32