【问题标题】:If case equals something then subtract date如果大小写等于某事,则减去日期
【发布时间】:2022-01-17 01:40:59
【问题描述】:

尝试编写一个查询来检查一列是否等于某个值。如果是这样,取日期列的值,然后减去某个值。

查询如下所示:

select
  v.voyage "Voyage"
 ,v.service "Service"
 ,to_char(vp.eta_date, 'MONTH dd, yyyy') "ETA"
 ,case 
    when v.service = "USA" then to_char(vp.eta_date, 'MONTH dd, yyyy') - 2
    else 'n/a'
    end as 'Notice'
from 
  table
// bunch of joins

当我运行上述代码时,我收到一条错误消息:

FROM keyword not found where expected

错误指向“通知”一词。

我基本上想检查服务是否等于“美国”,如果是,使用 eta_date 减去 2 来给我在通知列中的日期。

如果不是,那么就在“通知”列中显示“N/A”。

我做错了什么,我该如何解决?

【问题讨论】:

  • 如果"USA" 是一个文字值,它应该用单引号括起来,如'USA'
  • 进行更新后我仍然遇到同样的错误。
  • 我刚刚将“通知”的结尾更新为文字。现在我收到以下错误:“不一致的日期类型:expteced NUMBER got CHAR

标签: sql oracle case


【解决方案1】:

有几个语法错误和引用混淆使这令人困惑。这些是引号规则(与您的代码相关)

  • 对字符串使用单引号
  • 为列别名使用双引号

然后是这部分: to_char(vp.eta_date, 'MONTH dd, yyyy') - 2 告诉 sql 引擎从格式为“MONTH dd, yyyy”的字符串中减去 2。您可能的意思是从日期(vp.eta_date)中减去 2 天,然后将其格式化为“MONTH dd, yyyy”,可以写成to_char(vp.eta_date - 2, 'MONTH dd, yyyy')

把它们放在一起给出了

select
  v.voyage "Voyage"
 ,v.service "Service"
 ,to_char(vp.eta_date, 'MONTH dd, yyyy') "ETA"
 ,case 
    when v.service = 'USA' then to_char(vp.eta_date - 2, 'MONTH dd, yyyy')
    else 'n/a'
    end as "Notice"
from 
  table

【讨论】:

  • 我收到以下错误:数据类型不一致:预期 DATE 得到 CHAR。
  • 在 else 中,我添加了 to_char('n/a') 并且它起作用了。谢谢。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多