when语句使用in条件

4dbbbstv  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(380)

我想在子句中加上 Case 我的甲骨文报告的声明。
我有一个参数,它使用1月20日,2月20日等等。
当我选择apr-20时,我想检索jan-20、feb-20、mar-20和apr-20的行。如果我选择1月20日,我只想检索1月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'

等等。
有没有人知道一个替代方案,因为这似乎只适用于一个相同的子句?
任何帮助都将不胜感激!

h5qlskok

h5qlskok1#

只需转换为日期:

where to_date(gl.periodname, 'Mon-RR') <= to_date(:Parameter, 'Mon-RR')

(注意:您可能还需要考虑年份。这还不清楚。)
实际上,我建议将句点名称存储为yyyy-mm格式(“2020-01”),而不是您所使用的方式。
如果以相同的格式传入参数,则可以使用字符串比较:

where gl.PeriodName <= :Parameter
dxpyg8gm

dxpyg8gm2#

您的描述表明您正在查找值的日期范围。即从一月到参数中提供的参数月份。如果是这样的话,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;

我会比@gordon更进一步,把它存储为date。如果您真的需要经常使用的mon\u rr格式,请将其添加到虚拟列中。所以:

create table gl (
       period_date date
     , period_name varchar2(16) 
          generated always as (to_char(period_date, 'Mon-rr')) virtual );

相关问题