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

Oracle SQL如何去除内层查询输出单引号 实现IN子句正确匹配

Oracle 逗号拼接字符串IN查询失效解决方案

你现有写法失效的核心原因是:demo_temp表中codes字段存储的是包含单引号的逗号拼接字符串(值为'201,601'),替换单引号后得到的仍然是201,601这个整体字符串,IN运算符会将它作为单个完整值和demo表的codes字段匹配,自然找不到对应的单值201、601,所以返回0行。

方案1:REGEXP_SUBSTR + 层级查询拆分(兼容所有Oracle版本)

通过正则函数按逗号拆分拼接字符串,生成独立值的结果集再做IN匹配:

SELECT * 
FROM demo 
WHERE codes IN (
    SELECT REGEXP_SUBSTR(REPLACE(codes, '''', ''), '[^,]+', 1, LEVEL) 
    FROM demo_temp
    CONNECT BY REGEXP_SUBSTR(REPLACE(codes, '''', ''), '[^,]+', 1, LEVEL) IS NOT NULL
);

如果demo_temp存在多行数据,为了避免层级查询生成冗余数据,可以调整为:

SELECT * 
FROM demo 
WHERE codes IN (
    SELECT DISTINCT REGEXP_SUBSTR(REPLACE(codes, '''', ''), '[^,]+', 1, LEVEL) 
    FROM demo_temp
    CONNECT BY REGEXP_SUBSTR(REPLACE(codes, '''', ''), '[^,]+', 1, LEVEL) IS NOT NULL
    AND PRIOR SYS_GUID() IS NOT NULL
    AND PRIOR ROWID = ROWID
);

方案2:XMLTABLE拆分(Oracle 12c及以上版本推荐)

写法更简洁,性能更优:

SELECT *
FROM demo
WHERE codes IN (
    SELECT COLUMN_VALUE
    FROM demo_temp t,
         XMLTABLE(REPLACE(t.codes, '''', ''))
);

两种方案都可以将拼接的字符串拆分为201、601两个独立值的结果集,和demo表的codes匹配后即可返回你预期的15行数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:57:03