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

Oracle SQL中含重复值的IN查询如何返回对应数量的记录

问题原因解释

IN子句的本质是判断左侧字段值是否存在于右侧的集合中,数据库在执行查询时会自动对IN列表内的重复值做去重处理,IN ('1','2','2')在执行阶段等价于IN ('1','2')。而你的table1中c1是主键,每个值仅对应唯一一行数据,因此最终仅返回2条匹配结果,不会重复返回c1='2'的行。

实现需求的查询方案

你要实现按IN列表内的条目数量返回对应结果,不能直接用IN子句实现,需要先构造包含重复值的输入集合,再和原表做关联查询,示例如下:

方案1:用UNION ALL构造输入集合(兼容所有Oracle版本)

SELECT 1
FROM (
    -- 构造和你需求一致的带重复值的输入列表
    SELECT '1' AS input_val FROM DUAL
    UNION ALL
    SELECT '2' AS input_val FROM DUAL
    UNION ALL
    SELECT '2' AS input_val FROM DUAL
) input_list
INNER JOIN table1 t ON t.c1 = input_list.input_val;

这种写法会保留输入列表的重复条目,关联后c1='2'的行会匹配两次输入列表的'2',最终返回3条结果。

方案2:用JSON_TABLE解析列表(适用于Oracle 12c及以上版本)

如果输入值较多,不想写大量UNION ALL,可以用JSON函数批量解析输入列表:

SELECT 1
FROM table1 t
INNER JOIN JSON_TABLE(
    '["1","2","2"]', -- 把你的输入值按JSON数组格式填写
    '$[*]' COLUMNS input_val VARCHAR2(100) PATH '$'
) input_list ON t.c1 = input_list.input_val;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:33:03