Oracle SQL 有条件的案例

Oracle SQL Case with Condition

我对 Oracle SQL 案例陈述有疑问。

在where条件中我想应用以下条件。 如果 salary_date 为空,则 effective_date 应大于 01-Jan-2016

我试过

case when salary_date is null then
trunc(effective_date) >= '01-JAN-2016' else
         null end

但是上面的结果是

ORA-00933: SQL command not properly ended

我该如何解决这个问题?

你可以不用 CASE 语句试试这个

SELECT
..
..
WHERE ( trunc(effective_date) >= '01-JAN-2016' AND salary_date is null ) 
OR ( <some other condition> )

您的代码的问题是 SQL 解释器希望看到 'then' 关键字后的值,而您有一个条件子句。

也许试试这样的东西:

case when salary_date is null and trunc(effective_date) >= '01-JAN-2016' 
     then <value you need> 
     else null
...where salary_date is not null or effective_date >= date '2016-01-01'

由于 Oracle SQL 没有 "IF... THEN",请使用基本逻辑来转换您的布尔表达式。 IF a THEN b 与 (NON a) OR b 相同。这是我上面做的。

不要...不要...将日期与字符串进行比较。 '01-JAN-2016' 是字符串,不是日期。您必须将其转换为日期,例如 to_date('01-JAN-2016', 'dd-MON-yyyy').

或者,作为替代方案,请注意我如何输入 "date literal"(固定日期)。如果我不需要输入一天中的时间,我可以使用表达式 date '2016-01-01',这是一个 SQL 标准 (ANSI) "date literal"。那么你不需要给出日期格式模型;它必须始终采用准确的格式 yyyy-mm-dd。