你可以在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列中。这将是一个更清洁的方式然后使用每天的案例陈述,所以任何帮助将不胜感激。谢谢。
答案 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