对于select语句中的循环?

时间:2015-02-13 20:34:15

标签: sql plsql

你可以在select语句中使用for循环(特别是一个case)来定义多个值吗?

这是我的代码:

select case when sysdate in ( declare k DATE:= '2015-01-01', 
 Begin 
  FOR i in 1...365 LOOP
      k:=sydate +1;
  END LOOP;
END;
) then '1' else 'n/a' end FISCAL_YEAR from dual

我的语法可能存在多个问题。我想说的是,当今天的日期在一年之内,那么' 1'显示在FISCAL_YEAR列中。这将是一个更清洁的方式然后使用每天的案例陈述,所以任何帮助将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:2)

您可能只需要:

  select case when to_char(sysdate,'YYYY') = '2015' then 1 else 0 end
    from dual

不知道你在尝试做什么"嵌套" pl / sql块O.o

只需填写"年份"根据需要代替2015。 (即你需要的变量)。

如果这不是您所需要的,请提供一个小样本,显示预期的输入和输出。

答案 1 :(得分:0)

有更简单的方法:

SELECT CASE WHEN TRUNC(sysdate, 'YEAR') = DATE'2015-01-01' THEN '1' ELSE 'n/a' END AS fiscal_year
  FROM dual;

或者您可以使用DECODE()

SELECT DECODE(TRUNC(sysdate, 'YEAR', DATE'2015-01-01', '1', 'n/a') AS fiscal_year
  FROM dual;

而不是TRUNC(sysdate, 'YEAR')您可以使用TO_CHAR(sysdate, 'YYYY')等。

答案 2 :(得分:0)

根据您在结果集中需要的行,您可以在两个位置进行检查。如果您希望所有行都返回到可能超出当前FY的特定日期,请使用选择列表中的case检查。

select  <whatever>,
        case when DateField between date '2015-01-01'
                            and Add_Months( date '2015-01-01', 12 ) - 1
                then 'Y' else 'N' end
            as InFY2015
from    DataSource;

如果您希望结果集仅包含日期在FY内的行,请将检查放在where子句中。

select  <whatever>
from    DataSource
where   DateField between date '2015-01-01'
                  and Add_Months( date '2015-01-01', 12 ) - 1;

在后一个查询中,没有必要在2015财年&#34;因为他们都是。

答案 3 :(得分:0)

我认为以前的时间间隔答案是解决问题的正确方法。

然而,回答你的问题是否有一种方法如何在select语句中循环:不,但有一种方法如何生成一组递增的数字,所以这段代码就像你想要的伪代码一样:

select case when a.c>0 then '1' else 'n/a' end FISCAL_YEAR  
 from (select count(*) c from (
    SELECT ROWNUM+to_date('2015-01-01','yyyy-mm-dd')-1 n
    FROM   ( SELECT 1 
             FROM   dual
             CONNECT BY LEVEL <= 365)) lo 
       where trunc(sysdate)=lo.n) a
相关问题