解码不起作用

时间:2018-08-24 16:14:12

标签: sql oracle

我似乎无法弄清楚为什么这行不通-有人可以帮忙吗?这是一个较大查询的一部分,因此我不想更新已存在的查询-只需添加到其中-

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)

1 个答案:

答案 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的嵌套调用即可。