【问题标题】:Oracle view: How to display only days in future?Oracle 视图:如何仅显示未来几天?
【发布时间】: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:子查询返回多于一行

感谢您的帮助!

【问题讨论】:

  • 您的问题缺少某些内容,因为您的问题没有子查询,但您声称将其作为错误消息。
  • 添加了完整的查询

标签: sql oracle view


【解决方案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”部分移到脚本的末尾
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多