选择 case 语句在 oracle 中不起作用

Posted

技术标签:

【中文标题】选择 case 语句在 oracle 中不起作用【英文标题】:Select case statement not working in oracle 【发布时间】:2015-09-03 09:29:28 【问题描述】:

我有 Kpi_definition 表,其中对于特定的 event_id 可以有多个 KPI_DEF_ID 存在。例如,对于 event_id = 10250,有两个 KPI_DEF_ID。我必须首先检查KPI_DEF_ID 是否存在的event_id,如果不存在则将STATUS 设置为'N'。在另一种情况下,我必须检查KPI_DEF_ID 是否存在,并且所有KPI_DEF_ID 的字段值都没有KPI_ACTIVE_INITIAL,KPI_ACTIVE_CURRENT,KPI_ACTIVE_MANUAL,KPI_ACTIVE_DOWNTIME = 'N' 然后OS.STATUS 否则'N'

我已经编写了以下选择查询,但它不起作用。我正在视图内编写此查询。

SELECT 'EVENT'     AS OBJECT_TYPE, 
       os.event_id AS OBJECT_ID, 
       CASE 
         WHEN NOT EXISTS(SELECT KD.kpi_def_id 
                         FROM   rator_monitoring_configuration.kpi_definition KD 
                         WHERE  KD.event_id = os.event_id 
                                AND KD.kpi_type IN ( 19, 21 )) THEN 'N' 
         WHEN EXISTS(SELECT KD.kpi_def_id 
                     FROM   rator_monitoring_configuration.kpi_definition KD 
                     WHERE  KD.event_id = os.event_id 
                            AND KD.kpi_type IN ( 19, 21 ) 
                            AND ( KD.kpi_active_initial = 'N' 
                                   OR KD.kpi_active_current = 'N' 
                                   OR KD.kpi_active_manual = 'N' 
                                   OR KD.kpi_active_downtime = 'N' )) THEN 'N' 
         ELSE os.status 
       END         AS OBJECT_STATUS 
FROM RATOR_MONITORING.EVENT_STATUS OS

【问题讨论】:

不工作,因为你得到一个错误或不工作,结果不是你想要的? 您需要创建两个不同的 case 语句,而不是一个。此评论是针对您的“在另一种情况下” 我没有收到任何错误,我没有得到我想要的结果。 @realspirituals 你能告诉我我该怎么做吗?我不确定没有循环是否可能? 你在哪里 FROM ?您是在复制/粘贴中截断了查询还是在查询中忘记了它? 我已经编辑了我的查询。 【参考方案1】:
select decode(kpi_def_id,NULL,'N',
       case when instr(ini||curr||downtime||manual,'N',1) = 0 
       then status else 'N' end)
from ex_6

嗨,拉胡尔,

此查询在我的机器上有效。满足您的要求。如果有帮助,请标记答案。

【讨论】:

【参考方案2】:

尝试在ELSE 部分中使用另一个CASE。 像这样写查询:

SELECT 'EVENT'     AS OBJECT_TYPE, 
       os.event_id AS OBJECT_ID, 
       CASE 
         WHEN NOT EXISTS(SELECT KD.kpi_def_id 
                         FROM   rator_monitoring_configuration.kpi_definition KD 
                         WHERE  KD.event_id = os.event_id 
                                AND KD.kpi_type IN ( 19, 21 )) THEN 'N' 
         ELSE CASE WHEN EXISTS(SELECT KD.kpi_def_id 
                     FROM   rator_monitoring_configuration.kpi_definition KD 
                     WHERE  KD.event_id = os.event_id 
                            AND KD.kpi_type IN ( 19, 21 ) 
                            AND ( KD.kpi_active_initial = 'N' 
                                   OR KD.kpi_active_current = 'N' 
                                   OR KD.kpi_active_manual = 'N' 
                                   OR KD.kpi_active_downtime = 'N' )) THEN 'N' 
             ELSE os.status 
             END  
       END         AS OBJECT_STATUS 
FROM RATOR_MONITORING.EVENT_STATUS OS

【讨论】:

错误。你可以在一个case中使用多个when,这是一个CASE的意思 它不工作。逻辑不正确。我想说的是,例如对于 KPI_DEF_ID=1000356 如果任何字段为 N 并且对于 KPI_DEF_ID = 1000389 任何字段为 N 然后将状态设置为 'N' 。另一个条件是针对特定的 event_id 和 kpi_def_id,如果所有字段都是“N”,则将其设置为“N”。所以我想我们需要更多的案例。案例条件不正确。这里它只检查 KPI_DEF_ID = 1000356 的第一个条件并将结果返回给不正确的 N。 如果我完全理解你,那么只需检查if KPI_DEF_ID is present and none of the field value of KPI_ACTIVE_INITIAL = 'N' and KPI_ACTIVE_CURRENT = 'N' and KPI_ACTIVE_MANUAL = 'N' and KPI_ACTIVE_DOWNTIME = 'N' 然后检查os.status ELSE 'N' 因为所有其他条件都将在其他部分得到满足..【参考方案3】:
select case when decode(kpi_def_id,NULL,'N',col,0,'N') <> 'N' then status else 'N' end case from
(
 select kpi_def_id,instr(ini||curr||downtime||manual,'Y',1) col,ex_6.status status from ex_6
)

此查询有效,我连接了初始、停机时间、当前、手动列,并使用 instr 函数查找该字符串中是否有字符“Y”,并在外部查询中使用内部查询返回的结果,并借助解码功能我们可以达到预期的效果

问候,

【讨论】:

它不工作。逻辑不正确。我想说的是,例如对于 KPI_DEF_ID=1000356 如果任何字段为 N 并且对于 KPI_DEF_ID = 1000389 任何字段为 N 然后将状态设置为 'N' 。另一个条件是针对特定的 event_id 和 kpi_def_id,如果所有字段都是“N”,则将其设置为“N”。所以我想我们需要更多的案例。案例条件不正确。这里它只检查 KPI_DEF_ID = 1000356 的第一个条件并将结果返回给不正确的 N。 我没有使用表名和列名作为 urs 但这给出了预期的结果。我尝试在我的机器上执行它然后发布解决方案

以上是关于选择 case 语句在 oracle 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在连接条件中使用时语句在 oracle 中不起作用的情况

日期计算在 Oracle SQL 案例语句中不起作用?

为什么没有嵌套CASE语句不起作用? [重复]

Oracle存储过程在SSRS查询设计器中不起作用

如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行

在 oracle 的另一个 case 语句中使用 case 语句的结果