请原谅我对PL / SQL的非常有限的了解。
我试图在where子句中使用条件语句。 我有一个脚本,它将在今天和昨天之间运行run_date,但是如果星期几是星期一,它应该在run_date介于今天-3和今天-2之间运行。
我认为问题在于我正在尝试应用的条件语句,我试图使用CASE语句(下面的示例) - 但这只返回一个值,而我需要返回一种告诉脚本在两个日期之间运行。
代码 - (我试图实施案例陈述的地方)
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
如果有人需要更多信息,请随时提出任何帮助,我会很感激,我会告诉你我所知道的事情(虽然我对这种环境的经验非常有限)
谢谢,
答案 0 :(得分:0)
您可以使用一些布尔逻辑重写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
,这不是一个坏主意,但是使用它作为一个语句,而不给出返回值,而不是将它作为一个表达式(计算一个值)来比较它的值其他一些数据。
但是我更喜欢让我的条件尽可能清楚,所以我通常会尝试用布尔逻辑来编写它们;这当然是我自己的观点,不考虑绩效。
请考虑我只是修改了你的条件,假设它们是正确的;例如,如果您需要根据天数而不是小时,分钟等来检查您的条件,您应该考虑truncatig值...
答案 1 :(得分:0)
Where datecolumn >= case ...... end -- start point
And datecolumn < case ..... end -- end point
将案例表达式分为两部分,并将数据与这些计算进行比较。
答案 2 :(得分:0)
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
(to_char(sysdate, 'D') = '1'
和to_char(sysdate, '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) )
您需要注意NLS_TERRITORY
会话参数会影响星期一是否是一周的第一天(在某些地区不是),如果您受此影响,那么您可以获得使用以下内容的星期几的数值(独立于领土)
1 + TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' )
答案 3 :(得分:0)
为了获得最佳性能,您希望在日期列上具有单个条件(特别是如果优化器可以使用的索引),则可以在运行时静态评估值。我会用这样的东西:
var n = 11.13;
document.getElementById('num').value = +n; // 11
请注意MT0在确定星期几时对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
的评论。