如果Date不存在,返回min(DATE)
问题描述:
在Oracle SQLDeveloper中,我试图运行一个查询,在该查询中我发现返回特定日期作为StartDate,但如果最早的现有日期大于指定日期,则返回最小日期开始日期。我试着用CASE语句来做这件事,但我一直得到“缺少右括号”的错误。这里是我的代码到目前为止:如果Date不存在,返回min(DATE)
select
a.program
, a.match_file
, (case when b.date = '27-JAN-13' then b.date else min(b.date end)) as Startdate
from Schema1.program a, Schema1.detail b
where a.match_file = b.matchfile
and (case when b.date=' ' then min(b.date) else b.date end) = '27-JAN-13'
group by a.program, a.match_file
;
有人可以让我知道,如果我去这个错误?我也尝试过使用IF语句和一些不同的UNION语句,但我无法让它返回我想要的。
答
您可能想要考虑COALESCE函数(选取第一个非空参数)。但是,如果您针对空白而不是空值进行筛选,则可能无效。在这种情况下,CASE声明应该适合您的需求。
在你的代码中,你的第一个case语句中的“end”在min()中,这可能是你得到错误的原因。
, (case when b.date = '27-JAN-13' then b.date else min(b.date) end) as Startdate
我有麻烦搞清楚什么你正在尝试做的,而是根据你的描述我想出了下面的SQL。我不认为你需要在你的where子句中做任何过滤,因为你需要每一行都有结果。如果最早的日期在1月27日之后,您只想知道每个程序/文件组合。 select中的case语句处理这个问题。
“返回一个特定的日期为起始日期,但返回最小日期 如果现存最早的日期早于指定的开始 日期更大的”
select
a.program
, a.match_file
, case when min(b.date) > '27-JAN-13' then min(b.date) else '27-JAN-13' end as Startdate
from Schema1.program a, Schema1.detail b
where a.match_file = b.matchfile
group by a.program, a.match_file;
答
你的说法是语法不正确。 移动end
外分钟骨料按以下
select
a.program
, a.match_file
, (case when b.date = '27-JAN-13' then b.date else min(b.date) end) as Startdate
from Schema1.program a, Schema1.detail b
where a.match_file = b.matchfile
and (case when b.date=' ' then min(b.date) else b.date end) = '27-JAN-13'
group by a.program, a.match_file
;
只是一个建议,也许第一个答案或解决问题的OP,然后添加recomendation。我很困惑,想看看这个合并如何解决问题。你的答案仍然正确。 –
感谢您的回复pkm!我试着运行你的查询,但我得到了[Error ORA-00932](http://stackoverflow.com/questions/18330123/lookup-error-ora-00932-inconsistent-datatypes-expected-date-got-number)。我尝试使用to_date()来解决这个问题,但我仍然得到了同样的错误。 – Jacob
哦等一下! to_date函数确实有效!我只需要使用可识别的日期格式。 – Jacob