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>=SYSDATE-1, rm_name AS room from bk_date, bk_room;
它会抛出 ORA-00933: SQL 命令未正确结束
嗯,是的,因为您将where
子句放在了错误的位置?这两个表有什么关系?
好吧,谢谢我的笨头终于意识到,我只需要将“where”部分移到脚本的末尾以上是关于Oracle 视图:如何仅显示未来几天?的主要内容,如果未能解决你的问题,请参考以下文章