![](/img/trans.png)
[英]Case when statement while using in join condition not working in oracle
[英]Using an IN condition for a Case When Statement Oracle SQL
我想为我的 Oracle 报告使用带有Case
语句的 IN 子句。
我有一个使用 Jan-20、Feb-20 等的参数。
当我 select Apr-20 时,我想检索 Jan-20、Feb-20、Mar-20 和 Apr-20 的行。 如果我 select Jan-20,我想检索 Jan-20 的行。
我打算使用 CASE WHEN 语句。
计划如下:
WHERE GL.periodname IN
CASE WHEN :Parameter = 'Jan-20' THEN 'Jan-20'
CASE WHEN :Parameter = 'Feb-20' THEN 'Jan-20'
CASE WHEN :Parameter = 'Feb-20' THEN 'Feb-20'
CASE WHEN :Parameter = 'Mar-20' THEN 'Jan-20'
CASE WHEN :Parameter = 'Mar-20' THEN 'Feb-20'
CASE WHEN :Parameter = 'Mar-20' THEN 'Mar-20'
等等。
有谁知道另一种选择,因为这似乎只适用于一个 WHEN 子句相同?
任何帮助,将不胜感激!
只需转换为日期:
where to_date(gl.periodname, 'Mon-RR') <= to_date(:Parameter, 'Mon-RR')
(注意:您可能还需要考虑年份。这不清楚。)
我实际上建议将期间名称存储为 YYYY-MM 格式(“2020-01”),而不是按照您的方式存储。
然后,如果您以相同的格式传递参数,则可以使用字符串比较:
where gl.PeriodName <= :Parameter
您的描述表明您正在寻找值的日期范围。 即从一月到参数中提供的参数月份。 如果是这样,Case 语句不会给你你想要的,因为它只能返回一个值。 由于您正在寻找日期范围,请将您的期间名称列和参数转换为日期。 见小提琴。
with parameter as
( select to_date('&MonYr','Mon-rr') ep from dual )
, period ( start_period, end_period) as
( select trunc(ep,'year'), ep from parameter )
select period_name
from gl
join period
on to_date(period_name,'Mon-rr') between start_period and end_period;
我会 go 比@Gordon 更进一步,并将其存储为 DATE。 如果您确实需要经常使用 Mon_rr 格式,则将其添加为虚拟列。 所以:
create table gl (
period_date date
, period_name varchar2(16)
generated always as (to_char(period_date, 'Mon-rr')) virtual );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.