首页 > 解决方案 > Oracle:无法使用 to_CHAR 列排序

问题描述

应用程序开发人员要求我根据 created_date 列修改查询并按年份订购旅游 DESC,因为创建日期采用 DateTime 格式 我尝试创建一个视图以将日期转换为显示旅游年份的列及其看起来像这样:

看法:

CREATE VIEW vw.v_tour_year AS
SELECT to_char(created_date,'YYYY') "tour_year", tour_id, tour_name
FROM vw.tour

这是来自需要我更新的包正文的查询:

SELECT tu.*
      FROM (
        SELECT t.tour_id, t.tour_name
        FROM vw.tour t
        WHERE NOT EXISTS (
          SELECT 'x'
          FROM vw.tour_locale l
          WHERE l.culture_id = 1
          AND l.tour_name IS NOT NULL
          AND t.tour_id = l.tour_id
        )     
        UNION
        SELECT l.tour_id, l.tour_name
        FROM vw.tour_locale l
        WHERE l.culture_id = 1
        AND l.tour_name IS NOT NULL
      ) tu, vw.v_tour_year vt
     WHERE tu.tour_id = vt.tour_id
     ORDER BY vt.tour_year desc, tu.tour_name asc;

然而,甲骨文抱怨 vt.tour_year 是一个无效的标识符,我认为甲骨文不允许我这样做。这可能吗?或者我只能在 created_date 之前订购它?

标签: sqloracleoracle12c

解决方案


两件事情。

因为这个有一个问题

SELECT to_char(created_date,'YYYY') "tour_year"

您已双引号引用视图列的别名。在 Oracle 中,无论定义它的表达式的大小写如何,对象名称都存储为大写,除非您用双引号将它们括起来。您基本上有 2 个选项。

  1. 删除视图定义中“tour_year”中的引号并替换视图
  2. 如果你确实想要小写的 tour_year,你可以这样做ORDER BY vt."tour_year"

我肯定会推荐第一个选项。

另一个重要的一点是,您应该养成使用下面的ANSI JOIN语法而不是旧a,b的连接语法的习惯。

tu JOIN vw.v_tour_year vt
     ON ( tu.tour_id = vt.tour_id )

推荐阅读