【问题标题】:How to include a column containing calculation for a SELECT script?如何包含包含 SELECT 脚本计算的列?
【发布时间】:2020-01-05 11:32:00
【问题描述】:

刚刚开始了解 PL/SQL。

我想创建一个 SELECT 脚本,该脚本将显示开始日期和结束日期之间的日期差异,然后在 Flag_Status 列中相应地显示一条消息。

  • 如果计算结果为 28 天或更短 - 这应显示:“due to expire in the next 28 days”。

  • 如果计算结果超过 28 天 - 这应该显示:“由于从今天起超过 28 天到期”。

  • 否则显示:“已经过期”。

我尝试过使用 CASE、WHEN 和 THEN 语句。我已将计算包含在 CASE 功能中,但是在运行时,我遇到了无效标识符错误消息。

SELECT eligible_start, eligible_end,
CASE
WHEN to_date(eligible_end) - to_date(eligible_start) <= 28 THEN "due to expire within the next 28 days"
WHEN to_date(eligible_end) - to_date(eligible_start) > 28 THEN "due to expire more than 28 days from today"
ELSE "already expired"
END AS Flag_Status 
FROM Check_Table

我希望输出显示符合条件的开始日期、符合条件的结束日期和名为“Flag_Status”的列以及相应的消息。

输出显示错误消息“已过期”无效标识符。

请有人建议或提供一些建议吗?

【问题讨论】:

  • 嗨,戈登,感谢您的快速回复!我在上面进行了编辑,并包含了一个关于所需结果的链接。我希望这会有所帮助。
  • 需要注意的一点是,对于“将在接下来的 28 天到期”,您不应该有“

标签: sql oracle plsql plsqldeveloper


【解决方案1】:

首先要注意的是,您需要在CASE 语句的输出中使用单引号而不是双引号。单引号让你定义一个字符串,而双引号用于标识符。

考虑:

SELECT 
    eligible_start, 
    eligible_end,
    CASE
        WHEN TO_DATE(eligible_end) - TO_DATE(eligible_start) <= 28 THEN 'due to expire within the next 28 days'
        WHEN TO_DATE(eligible_end) - TO_DATE(eligible_start) > 28 THEN 'due to expire more than 28 days from today'
        ELSE 'already expired'
    END AS Flag_Status 
FROM Check_Table

其他说明:

  • CASE语句的逻辑不是很清楚;你预计'alreay expired' 什么时候出现?您的示例数据没有显示,但您应该知道,给定当前 SQL,它只会在两个日期列之一是 NULL 时出现,导致减法的结果也变为 NULL;这真的是你想要的吗?

  • 您似乎将日期存储为字符串;这不是一个好习惯,最好将这些列转换为 DATE 数据类型。否则,当使用TO_DATE() 时,我建议传递第二个参数,它表示要转换的字符串的 NLS 格式,而不是依赖于数据库或会话默认值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多