选择 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章