Oracle 视图:如何仅显示未来几天?

Posted

技术标签:

【中文标题】Oracle 视图:如何仅显示未来几天?【英文标题】:Oracle view: How to display only days in future? 【发布时间】:2021-06-10 15:37:09 【问题描述】:

我只需要在 oracle 视图中显示数据列中的未来值,所以我的脚本如下所示:

CREATE OR REPLACE VIEW "CH"."BK_VIEW_SCHEDULE" AS SELECT (CASE when dt_date>=SYSDATE-1 THEN dt_date end) AS dat from bk_date

带有来源日期的表格:

但它会将过去的日期返回为 null

如何在没有过去日期空行的情况下仅获得未来日期值?

我知道这个选择查询可以满足我的需要:

CREATE OR REPLACE VIEW "CH"."BK_VIEW_SCHEDULE" AS SELECT (SELECT dt_date FROM bk_date WHERE dt_date>=SYSDATE-1) AS dat from bk_date ORDER BY dt_date;,

但在视图中它会抛出错误ORA-01427:子查询返回多于一行

感谢您的帮助!

【问题讨论】:

您的问题缺少某些内容,因为您的问题没有子查询,但您声称将其作为错误消息。 添加了完整的查询 【参考方案1】:

但它会将过去的日期返回为 null

没有过滤器的 case 表达式仍将返回基表中的所有行;你在 case 表达式中没有 else 子句,所以当条件不匹配时,你会得到默认的 null。

您的第二次尝试:

CREATE OR REPLACE VIEW "CH"."BK_VIEW_SCHEDULE" AS
SELECT  (SELECT dt_date FROM bk_date WHERE dt_date>=SYSDATE-1) AS dat from bk_date
ORDER BY dt_date

... 有一个不必要的子查询。这将返回所有未来的行,这会导致 ORA-01427 错误 - 除非基表仅包含一个未来日期。

您可以只使用您已经知道有效的过滤器,而无需子查询:

CREATE OR REPLACE VIEW BK_VIEW_SCHEDULE AS
SELECT dt_date FROM bk_date WHERE dt_date>=SYSDATE-1

db<>fiddle

在视图定义中包含order by 子句没有意义。语法上是允许的;但不能保证针对视图的查询将按该顺序返回数据,除非该查询有自己的order by 子句——这使得视图定义中的那个是多余的。

【讨论】:

谢谢,但如果我需要在视图中添加更多列,例如:CREATE OR REPLACE VIEW BK_VIEW_SCHEDULE AS SELECT dt_date FROM bk_date WHERE dt_date&gt;=SYSDATE-1, rm_name AS room from bk_date, bk_room; 它会抛出 ORA-00933: SQL 命令未正确结束 嗯,是的,因为您将where 子句放在了错误的位置?这两个表有什么关系? 好吧,谢谢我的笨头终于意识到,我只需要将“where”部分移到脚本的末尾

以上是关于Oracle 视图:如何仅显示未来几天?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示 iCarousel 中心视图仅突出显示其他最近的视图显示一些黑暗

如何仅在某些页面视图显示上显示块

如何仅显示具有值的文本视图?

如何根据 Oracle 中用户的输入创建动态视图?

如何仅显示与视图 2 中关联的节点的分类术语?

如何在Objective C的表视图中仅显示具有内容的表行