如果日期列大于sysdate,则'Y'

2022-03-03 00:00:00 sql oracle case plsql

我创建了一条CASE语句,该语句检查另一列中的日期,并以别名结束。

我需要创建另一个case语句,该语句将查看新的别名列,并查看它是否大于sysdate。如果是,则为"Y"。

以下是当前查询:

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

产生以下结果:

Voyage | Service | ETA   | Notice
_______________________________
test12 | USA     | 12/13 | 12/11
test14 | USA     | 12/15 | 12/13

我需要这样做:

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"
  ,case 
    when "Notice" > sysdate then 'Y' else 'N'
    end as "Sent"
from 
  table   

应生成以下内容:

Voyage | Service | ETA   | Notice | Sent
________________________________________
test12 | USA     | 12/13 | 12/11  | N
test14 | USA     | 12/15 | 12/13  | Y

但我收到一个错误,内容为:

a non-numeric character was found where a numeric was expected

如何修复此问题?

*编辑*

我收到以下错误:

"Notice": invalid identifier

解决方案

您需要其中一个复制第二个case中的&Quot;Notify&Quot;列的整个定义-这不是最佳做法,也不是DRY(即复制相同的代码)

  ,case 
    when /*"Notice"*/
     case 
     when v.service = 'USA' then to_char(vp.eta_date - 2, 'MONTH dd, yyyy')
     else 'n/a'
     end 
     > sysdate then 'Y' else 'N'
    end as "Sent"

或最好使用子查询或CTE

with dt as (
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  
)
select dt.* ,
case 
    when "Notice" > sysdate then 'Y' else 'N'
    end as "Sent"
from dt

正如注释中指出的,这将使您能够编译(分析)查询,但是不会返回预期结果。

相关文章