繁体   English   中英

在语句 Oracle SQL 的情况下使用 IN 条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM