带条件的 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) >= '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来存时间数据