Oracle SQL:案例语句

Posted

技术标签:

【中文标题】Oracle SQL:案例语句【英文标题】:Oracle SQL: Case statement 【发布时间】:2021-07-28 03:30:46 【问题描述】:

我不确定将 case 语句放在哪里,无论是在 select 还是 where 子句中。当 cnt_subj = MEPC_PL 时,我试图从表 c 中获取数据,然后 metric_id 将等于表 m 中的 6135。任何人都可以帮忙吗?先感谢您! :)

SELECT DISTINCT
    m.metric_id         AS metric_id,
    m.subject_abbrevn   AS p_subj,
    m.table_abbrevn     AS cnt_subj,
    c.p_id              AS p_id,
    c.cnt_id            AS cnt_id,
    c.gl_id             AS gl_id,
    case c.cnt_subj
    when 'MEPC_PL' then 6135
    end m.metric_id
FROM
    T_CROMS_CAT_T   m,
    croms_qc_currency_1_v c

【问题讨论】:

【参考方案1】:

我认为这是您要查找的查询:

SELECT DISTINCT
    m.metric_id         AS metric_id,
    m.subject_abbrevn   AS p_subj,
    m.table_abbrevn     AS cnt_subj,
    c.p_id              AS p_id,
    c.cnt_id            AS cnt_id,
    c.gl_id             AS gl_id,
FROM croms_qc_currency_1_v c
INNER JOIN T_CROMS_CAT_T m ON DECODE(c.cnt_subj, 'MEPC_PL', 6135, NULL) = m.metric_id;

你真的需要DISTINCT吗?这些 ID 是否不止一行? 此外,如果您有其他需要翻译的 CNT_SUBJ 值,您可以扩展它。

【讨论】:

这正是我想要的。非常感谢!只有 1 个问题,解码中的 null 如果我有超过 1 个条件,我可以跳过它,对吗?例如,我想要它'MEPC_PL' 然后返回 6135 和 'MEKM_PL' 然后返回 6136。 @VincentToong 是的,您可以省略 NULL,它的工作原理相同。如果不匹配,Oracle 仍将返回 NULL。如果我没有提到如果你有一堆这样的话,我也会失职.【参考方案2】:

我想你想在CASE 表达式中添加一个ELSE 条件:

SELECT DISTINCT
    m.metric_id         AS metric_id,
    m.subject_abbrevn   AS p_subj,
    m.table_abbrevn     AS cnt_subj,
    c.p_id              AS p_id,
    c.cnt_id            AS cnt_id,
    c.gl_id             AS gl_id,
    CASE c.cnt_subj WHEN 'MEPC_PL' THEN 6135 ELSE m.metric_id END AS metric_id_new
FROM T_CROMS_CAT_T m
INNER JOIN croms_qc_currency_1_v c
    ON <some join condition here>

【讨论】:

我认为它非常接近我想要实现的目标,但不是将它作为新列添加,而是我想要 m.metric_id = 6135。逻辑是,从表 c 中检查列中的数据是否等于 MEPC_PL,如果是,则提取行,将 metric_id 设置为 6135,然后从表 m 中获取数据,其中行的 metric id 为 6135。在这种情况下,也许我应该将 case 表达式放在 where 子句中? 请在您的问题中添加示例数据以避免进一步的猜测。【参考方案3】:

您可以将JOIN 条件表述为:

FROM T_CROMS_CAT_T m JOIN
     croms_qc_currency_1_v c
     ON m.metric_id = 6135 AND c.cnt_subj = 'MEPC_PL'

非常重要:这不会妨碍优化器,因此它应该比ON 子句中的DECODE()CASE 表达式快得多。

【讨论】:

以上是关于Oracle SQL:案例语句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:案例语句

经典案例:如何优化Oracle使用DBlink的SQL语句

Oracle SQL 中的复杂案例语句

常用sql语句及案例(oracle)

常用sql语句及案例(oracle)

Oracle SQL - 是不是有更有效的方法来组织大量案例语句