[英]how to use a case statement in a sql where condition
我有以下格式的 sql:
select distinct
ora_hash( ah.target_name
|| to_char( start_timestamp, 'DD-MON-YY HH24:MI:SS' ))
|| ','
|| 'Critical'
|| ','
|| host_name
|| ','
|| ah.target_name
|| ','
|| 'Instance unexpectedly shutdown at '
|| to_char( start_timestamp, 'DD-MON-YY HH24:MI:SS' )
from
sysman_ro.mgmt$availability_history ah
join sysman_ro.mgmt$target_members tm
on ah.target_name = tm.member_target_name
join sysman_ro.mgmt$target mt
on ah.target_name = mt.target_name
left outer join sysman_ro.mgmt$blackout_history bh
on mt.target_name = bh.target_name
where
tm.aggregate_target_name like 'PROD_DB'
and ah.availability_status_code = 0
and ah.start_timestamp > sysdate -0.2
and ah.start_timestamp > bh.start_time
and ah.target_type = 'oracle_database'
现在的问题是 bh.start_time 不会为少数目标返回任何内容。 所以在这里我想引入一个 case 语句,如果 bh.start_time 有一个值(比如 08-NOV-22),那么应该考虑条件 'ah.start_timestamp > bh.start_time' 并且如果没有返回值对于 bh.start_time 那么应该跳过条件 'ah.start_timestamp > bh.start_time'。
在'where'条件下这可能吗? 谢谢。
这不是CASE
语句,它只是一个OR
条件。 例如:
AND (bh.start_time IS NULL OR ah.start_timestamp > bh.start_time)
因此,如果start_time
为NULL
或start_timestamp > start_time
,则总体条件得到满足。
首先 - CASE 是一个表达式(不是语句)。 它连续工作,第一个WHEN条件为True将返回THEN值并退出CASE 。 这意味着您应该以一种能够给出您想要的结果的方式对这些条件进行排序。
一个小样本数据(我们不知道你的数据):
WITH
ah AS
(
Select 1 "AH_ID", To_Date('08.11.2022 13:00:00', 'dd.mm.yyyy hh24:mi:ss') "AH_DATE" From Dual Union All
Select 2 "AH_ID", To_Date('08.11.2022 16:00:00', 'dd.mm.yyyy hh24:mi:ss') "AH_DATE" From Dual Union All
Select 3 "AH_ID", To_Date('08.11.2022 19:00:00', 'dd.mm.yyyy hh24:mi:ss') "AH_DATE" From Dual Union All
Select 4 "AH_ID", To_Date('08.11.2022 22:00:00', 'dd.mm.yyyy hh24:mi:ss') "AH_DATE" From Dual Union All
Select 5 "AH_ID", To_Date('08.11.2022 23:00:00', 'dd.mm.yyyy hh24:mi:ss') "AH_DATE" From Dual
),
bh AS
(
Select 1 "BH_ID", 1 "AH_ID", To_Date('08.11.2022 07:00:00', 'dd.mm.yyyy hh24:mi:ss') "BH_DATE" From Dual Union All
Select 2 "BH_ID", 1 "AH_ID", To_Date('08.11.2022 09:00:00', 'dd.mm.yyyy hh24:mi:ss') "BH_DATE" From Dual Union All
Select 3 "BH_ID", 3 "AH_ID", To_Date('08.11.2022 19:00:00', 'dd.mm.yyyy hh24:mi:ss') "BH_DATE" From Dual Union All
Select 4 "BH_ID", 3 "AH_ID", To_Date('08.11.2022 20:00:00', 'dd.mm.yyyy hh24:mi:ss') "BH_DATE" From Dual Union All
Select 5 "BH_ID", 5 "AH_ID", To_Date('08.11.2022 21:00:00', 'dd.mm.yyyy hh24:mi:ss') "BH_DATE" From Dual
)
如果我们离开加入桌子,如果它就像
SYSDATE = To_Date('09.11.2022 01:00:00', 'dd.mm.yyyy hh24:mi:ss')
我选择 SYSDATE_LIMIT 列只是为了能够直观地比较稍后将过滤的值:
Select
ah.AH_ID,
To_Char(ah.AH_DATE, 'dd.mm.yyyy hh24:mi:ss') "AH_DATE",
To_Char(To_Date('09.11.2022 01:00:00', 'dd.mm.yyyy hh24:mi:ss') - 0.2, 'dd.mm.yyyy hh24:mi:ss') "SYSDATE_LIMIT",
bh.BH_ID,
To_Char(bh.BH_DATE, 'dd.mm.yyyy hh24:mi:ss') "BH_DATE"
From
ah
Left Join
bh ON(bh.AH_ID = ah.AH_ID)
结果是:
AH_ID | AH_DATE | SYSDATE_LIMIT | BH_ID | BH_DATE |
---|---|---|---|---|
1个 | 08.11.2022 13:00:00 | 08.11.2022 20:12:00 | 1个 | 08.11.2022 07:00:00 |
1个 | 08.11.2022 13:00:00 | 08.11.2022 20:12:00 | 2个 | 08.11.2022 09:00:00 |
2个 | 08.11.2022 16:00:00 | 08.11.2022 20:12:00 | ||
3个 | 08.11.2022 19:00:00 | 08.11.2022 20:12:00 | 3个 | 08.11.2022 19:00:00 |
3个 | 08.11.2022 19:00:00 | 08.11.2022 20:12:00 | 4个 | 08.11.2022 20:00:00 |
4个 | 08.11.2022 22:00:00 | 08.11.2022 20:12:00 | ||
5个 | 08.11.2022 23:00:00 | 08.11.2022 20:12:00 | 5个 | 08.11.2022 21:00:00 |
使用 CASE 表达式在 WHERE 子句中进行过滤的方法之一可能就像这里(代码中的注释)
... ... ...
Where
CASE
WHEN bh.BH_ID Is Null THEN 0 -- there is no matching row in bh table - excluded
WHEN ah.AH_DATE <= bh.BH_DATE THEN 0 -- AH_DATE is not greater than BH_DATE - excluded
WHEN ah.AH_DATE <= To_Date('09.11.2022 01:00:00', 'dd.mm.yyyy hh24:mi:ss') - 0.2 THEN 0 -- AH_DATE is not greater than SYSDATE - 0.2 - excluded
ELSE 1 -- there is a row in bh table where AH_DATE is greater than BH_DATE and AH_DATE is greater than SYSDATE - 0.2 - row returned
END = 1
结果:
AH_ID | AH_DATE | SYSDATE_LIMIT | BH_ID | BH_DATE |
---|---|---|---|---|
5个 | 08.11.2022 23:00:00 | 08.11.2022 20:12:00 | 5个 | 08.11.2022 21:00:00 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.