我似乎无法弄清楚为什么这行不通-有人可以帮忙吗?这是一个较大查询的一部分,因此我不想更新已存在的查询-只需添加到其中-
SELECT INNERPART.*,
SUBSTR(status_remday, 1,1) AS COMPLETE,
**--this line shows if it is completed or not**
DECODE(SUBSTR(status_remday, 1,1),'Y','Complete','N','Incomplete', null) AS qualCompleted,
**--need this to show if the curriculum is complete or not, in it's own row. will eventually have about 10 or more qual_ids**
decode(INNERPART.qualID,'ENG_CURR_SAFETY CERT', qualCompleted) as SAFETY
FROM (Innerpart)
答案 0 :(得分:2)
问题是SQL语法(无论如何是Oracle方言)都不允许您在SELECT
子句中定义别名,然后在同一SELECT
子句中引用相同的别名(即使在该条款的后面)。
您将qualCompleted
定义为DECODE
,然后在第二个qualCompleted
中引用DECODE
。那行不通。
如果您不想在一个级别上定义qualCompleted
,然后将所有内容包装在可以引用该名称的外部SELECT
内,则另一个选择是使用第一个{{1} },而不是第二个DECODE
中的别名。
此:
DECODE
应改为
decode(INNERPART.qualID,'ENG_CURR_SAFETY CERT', qualCompleted) as SAFETY
另一件事:默认情况下,如果decode(INNERPART.qualID,'ENG_CURR_SAFETY CERT',
DECODE(SUBSTR(status_remday, 1,1),'Y','Complete','N','Incomplete', null) )
as SAFETY
中的第一个参数不匹配,DECODE
返回null
。因此,您实际上不需要在DECODE
的定义中提供最后一个参数(null
)。
编辑:这是Oracle文档中有关列别名的内容。
链接:https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#i2080424
c_alias 指定列表达式的别名。 Oracle数据库将在结果集的列标题中使用此别名。 AS关键字是可选的。别名有效地重命名了选择 查询期间的列表项。 别名可用于 查询中的order_by_clause而不是其他子句。
这意味着几件事。不能在qualCompleted
子句,qualCompleted
等中的同一查询中使用类似您创建的{strong> 这样的别名,甚至不能在{{ 1}}子句的创建位置。它只能在同一查询的WHERE
子句中使用。任何其他用途都必须在周围的“外部”查询中。不过,这也确实意味着,如果需要,您可以在GROUP BY
中使用它。
在您的情况下,如果仅创建SELECT
以便可以在另一个ORDER BY
中引用它,并且没有其他用途,那么您甚至根本不需要定义它(因为它仍然无济于事);只需直接将ORDER BY
定义为对qualCompleted
的嵌套调用即可。