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:案例语句的主要内容,如果未能解决你的问题,请参考以下文章