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

Oracle表多列值匹配查询:如何生成符合规则的两类输出结果

解决方案

实现逻辑

先通过CTE定义所有待查询的指定值,再关联原表统计每行数据对目标值的匹配次数,最后按匹配次数拆分两个输出结果集。

完整SQL代码

首先替换代码中T_DATA为你的实际表名,若三个NUMBER列是数值类型,将search_values中查询值的单引号去掉即可:

-- 定义所有要检索的目标值
WITH search_values AS (
    SELECT '1234567' val FROM DUAL UNION ALL
    SELECT '9876543' val FROM DUAL UNION ALL
    SELECT '0616167' val FROM DUAL UNION ALL
    SELECT '1112223' val FROM DUAL UNION ALL
    SELECT '999999' val FROM DUAL
),
-- 统计每行匹配次数
match_calc AS (
    SELECT 
        t.*,
        s.val search_val,
        CASE WHEN t."NUMBER 1" = s.val THEN 1 ELSE 0 END 
        + CASE WHEN t."NUMBER 2" = s.val THEN 1 ELSE 0 END 
        + CASE WHEN t."NUMBER 3" = s.val THEN 1 ELSE 0 END match_cnt
    FROM search_values s
    LEFT JOIN T_DATA t 
        ON s.val IN (t."NUMBER 1", t."NUMBER 2", t."NUMBER 3")
)

-- Output1:仅匹配1次的行
SELECT ID, "NUMBER 1", "NUMBER 2", "NUMBER 3", LOC 
FROM match_calc 
WHERE match_cnt = 1;

-- Output2:多次匹配或无匹配的行
SELECT 
    NVL(ID, search_val) ID,
    "NUMBER 1",
    "NUMBER 2",
    "NUMBER 3",
    LOC,
    CASE 
        WHEN match_cnt >=2 THEN 'Multiple Match'
        ELSE 'No Match' 
    END Flag
FROM match_calc
WHERE match_cnt >=2 OR match_cnt = 0;

注意事项

  • 列名包含空格时Oracle需要用双引号包裹,如果你实际表的列名没有空格可以去掉双引号
  • 需要新增查询值时,直接在search_values的CTE中按SELECT '目标值' val FROM DUAL UNION ALL格式添加即可
  • 如果需要同时返回两个结果集,可以分别执行两个SELECT语句,或者用Oracle游标封装返回

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 16:06:05