带条件的 Oracle SQL 案例

Posted

技术标签:

【中文标题】带条件的 Oracle SQL 案例【英文标题】:Oracle SQL Case with Condition 【发布时间】:2016-10-15 08:09:50 【问题描述】:

我有一个关于 Oracle SQL 案例语句的问题。

在 where 条件下,我想应用以下条件。 如果salary_date 为null,则 Effective_date 应大于2016 年1 月1 日

我试过了

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

但是上面的结果是

ORA-00933:SQL 命令未正确结束

我该如何解决这个问题?

【问题讨论】:

无关,但是:做 NOT 依赖邪恶的隐式数据类型转换。 '01-JAN-2016' 是一个字符串值,不是 DATE。使用适当的日期文字,例如DATE '2016-01-01'to_date('2016-01-01', 'yyyy-mm-dd') 【参考方案1】:

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

不妨试试这样的:

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

【讨论】:

感谢您的洞察力。我应该只在 Salary_date 为 null 时检查,然后 Effective_date 必须大于 '01-JAN-2016' @user75ponic:这正是那个条件正在做的事情。 @a_horse_with_no_name - 不是真的。如果您完整阅读了 OP 的问题,而不仅仅是代码 sn-p,您会看到他试图在 WHERE 子句中使用案例“条件”。唉,Oracle SQL 只有 case 表达式,所以“case”是错误的工具。类似的东西可以在 PL/SQL 中工作,但不能在普通 SQL 中工作。 mass_dynamic 显示了(正确)使用 case 表达式的示例,但这与 OP 的问题无关。【参考方案2】:

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

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

【讨论】:

感谢您的洞察力。我应该只在 Salary_date 为 null 时检查,然后 Effective_date 必须大于 '01-JAN-2016' 这是 AND 条件在圆括号内的作用.. 尝试代码并检查结果 只有当salarydate 为空时,trunc(effective_date) &gt;= '01-JAN-2016' 条件才会被检查,因为 AND @mhasan - OP 是对的。逻辑很简单:如果salary_date 为null THEN eff_date > 不管。 IF a THEN b 可以写成“NON a OR b”。你把它写成“a AND b”。你做错了两件事。【参考方案3】:
...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 '2016-01-01',它是一个 SQL 标准 (ANSI) “日期文字”。那么就不需要给出日期格式模型了;它必须始终采用 yyyy-mm-dd 的确切格式。

【讨论】:

谁投了反对票,你能留下一张纸条解释你对我的回答的反对吗?谢谢!

以上是关于带条件的 Oracle SQL 案例的主要内容,如果未能解决你的问题,请参考以下文章

实际案例告诉你为什么Oracle不建议使用varchar2来存时间数据

带计数的 SQL 案例语句?

Oracle数据库SQL语言实战培训教程(全面详细案例精讲)套餐

oracle中sql案例

常用sql语句及案例(oracle)

Oracle SQL - 动态案例语句