PL/SQL—在“where”子句中使用条件语句在两个日期之间运行
请原谅我对PL/SQL的了解非常有限 我试图在where子句中使用条件语句。 我有一个脚本,它将在run_date介于今天和昨天之间的地方运行,但是如果一周的某一天是星期一,它应该在run_date介于今天-3和今天-2之间的地方运行 我认为问题在于我试图应用的条件语句,我试图使用下面的CASE语句示例,但它只返回一个值,而我需要返回一种方法,告诉脚本在两个日期之间运行 代码- 在那里我试图实施案例陈述PL/SQL—在“where”子句中使用条件语句在两个日期之间运行,sql,oracle,oracle11g,where,Sql,Oracle,Oracle11g,Where,请原谅我对PL/SQL的了解非常有限 我试图在where子句中使用条件语句。 我有一个脚本,它将在run_date介于今天和昨天之间的地方运行,但是如果一周的某一天是星期一,它应该在run_date介于今天-3和今天-2之间的地方运行 我认为问题在于我试图应用的条件语句,我试图使用下面的CASE语句示例,但它只返回一个值,而我需要返回一种方法,告诉脚本在两个日期之间运行 代码- 在那里我试图实施案例陈述 select record_type a, count(record_type) b fro
select record_type a, count(record_type) b
from orf_po_data
where
(CASE
WHEN ((to_char(sysdate, 'D')) = '1') THEN (between trunc(sysdate-3) and trunc(sysdate-2))
WHEN ((to_char(sysdate, 'D')) > '1' and (to_char(sysdate, 'D')) <= '5') THEN (between trunc(sysdate-1) and trunc(sysdate)
ELSE null
END) run_date
group by record_type
order by record_type
如果有人需要更多信息,请随时询问,我会告诉你我所知道的,尽管我对这种环境的经验非常有限
谢谢,您可以用一些布尔逻辑重写WHERE条件;如果我理解清楚,您可能需要:
WHERE ( to_char(sysdate, 'D') = '1' AND
run_date between sysdate-1 and sysdate
)
OR
( to_char(sysdate, 'D') != '1' AND
run_date between sysdate-3 and sysdate -2
)
您编写的代码使用CASE,这不是一个坏主意,但将其用作语句,而不提供返回值,而不是将其用作表达式来计算值,将其值与其他数据进行比较。
然而,我更喜欢让我的条件尽可能清晰,所以我通常尝试用布尔逻辑来编写它们;这当然是我自己的观点,不考虑性能
请考虑我只是修改了你的条件,假设它们是正确的;例如,如果你需要根据天,甚至不是小时,分钟,……/P>检查你的条件,你应该考虑TrcActug值。
Where datecolumn >= case ...... end -- start point
And datecolumn < case ..... end -- end point
将tor case表达式分为两部分,并将数据与这些计算结果进行比较
CASE WHEN case_a THEN filter_a
WHEN case_b THEN filter_b
ELSE exclude_the_row END
可以重写为:
WHERE ( case_a AND filter_a )
OR ( NOT case_a AND case_b AND filter_b )
由于case_a和case_b到_charsysdate,'D'='1'和到_charsysdate,'D'>'1'的条件是相互排斥的,因此您可以忽略NOT case_a部分,逻辑是:
WHERE ( TO_CHAR(SYSDATE, 'D') = '1'
AND run_date BETWEEN TRUNC(SYSDATE-3) AND TRUNC(SYSDATE-2) )
OR ( TO_CHAR(SYSDATE, 'D') > '1' AND TO_CHAR(SYSDATE, 'D') <= '5'
AND run_date BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE) )
为了获得最佳性能,您希望在日期列上有一个条件,特别是如果有一个索引,优化器可以使用该索引与运行时可以静态计算的值进行比较。我会用这样的方式:
where datecolumn
between trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 3 else 1 end
and trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 2 else 0 end
在确定一周中的哪一天时,还要注意MT0对nls_territory的评论。您需要根据哪些时间精度筛选表列?第四列的名称是什么?我喜欢它的简单性,但有一个小问题是,第二个例子是to_charsysdate,'D'>'1',to_charsysdate,'D'='1',然后3个例子是to_charsysdate,'D'>'1',to_charsysdate,'D'
where datecolumn
between trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 3 else 1 end
and trunc(sysdate) - case when to_char(sysdate, 'D') = '1' then 2 else 0 end