Oracle SQL选择
我编写了一个简单的查询来比较日期,但是在查询的最后一行出现了一个无效的标识符错误。我得到下面的错误。第15行恰好是查询的最后一行 第15行第6列出错Oracle SQL选择,sql,oracle,Sql,Oracle,我编写了一个简单的查询来比较日期,但是在查询的最后一行出现了一个无效的标识符错误。我得到下面的错误。第15行恰好是查询的最后一行 第15行第6列出错 标识符有什么问题?您不能在where条件下使用别名SD。 例如: SQL> select 1 as one 2 from dual 3 where one = ( select 1 from dual) ; where one = ( select 1 from dual) * ERROR at line 3: ORA
标识符有什么问题?您不能在
where
条件下使用别名SD
。
例如:
SQL> select 1 as one
2 from dual
3 where one = ( select 1 from dual) ;
where one = ( select 1 from dual)
*
ERROR at line 3:
ORA-00904: "ONE": invalid identifier
SQL> select 1 as one
2 from dual
3 where 1 = ( select 1 from dual) ;
ONE
----------
1
如果要在where
条件中使用别名,则需要包装查询以获得包含具有所需别名的列的结果:
SQL> select *
2 from (
3 select 1 as one
4 from dual
5 )
6 where one = ( select 1 from dual) ;
ONE
----------
1
SQL>
您不能在
where
条件下使用别名SD
。
例如:
SQL> select 1 as one
2 from dual
3 where one = ( select 1 from dual) ;
where one = ( select 1 from dual)
*
ERROR at line 3:
ORA-00904: "ONE": invalid identifier
SQL> select 1 as one
2 from dual
3 where 1 = ( select 1 from dual) ;
ONE
----------
1
如果要在where
条件中使用别名,则需要包装查询以获得包含具有所需别名的列的结果:
SQL> select *
2 from (
3 select 1 as one
4 from dual
5 )
6 where one = ( select 1 from dual) ;
ONE
----------
1
SQL>
要详细说明公认的答案:
Select OP_DATE,
ID,
TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') as SD
From DT.OP_DATES
Where OP_DATE_IND = 'CMPLTD'
And OP_DATE_STS = 'M'
And TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') =
(SELECT TO_CHAR(SYSDATE, 'DD-MM-YY') FROM DUAL)
要详细说明公认的答案:
Select OP_DATE,
ID,
TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') as SD
From DT.OP_DATES
Where OP_DATE_IND = 'CMPLTD'
And OP_DATE_STS = 'M'
And TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') =
(SELECT TO_CHAR(SYSDATE, 'DD-MM-YY') FROM DUAL)
@为了进一步解释Aleksej的答案:考虑SQL语句中子句的求值顺序总是有帮助的。至少在原则上,FROM子句(包括连接条件)和WHERE子句的求值优先于任何其他子句,而SELECT子句的求值接近末尾。SELECT子句中定义的别名对WHERE子句不可见。数据库软件创建者可以自由地做其他事情(例如对以后定义的任何别名进行“预读”),但我不知道是否有人为这个特定的操作这么做,Oracle当然没有。@BreenDeen-作为使用子查询的替代方法,您可以将整个
重复到_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY')
位于WHERE
子句的左侧,而不是使用别名。这将避免子查询外部查询结构。这是更多的打字,但它不是低效的;该函数在查询中出现两次,但实际上没有执行两次。Oracle引擎足够聪明,可以看到它是同一个函数,因此它只计算一次(每行)。@BreenDeen-进一步解释Aleksej的答案:考虑SQL语句中子句的求值顺序总是有帮助的。至少在原则上,FROM子句(包括连接条件)和WHERE子句的求值优先于任何其他子句,而SELECT子句的求值接近末尾。SELECT子句中定义的别名对WHERE子句不可见。数据库软件创建者可以自由地做其他事情(例如对以后定义的任何别名进行“预读”),但我不知道是否有人为这个特定的操作这么做,Oracle当然没有。@BreenDeen-作为使用子查询的替代方法,您可以将整个重复到_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY')
位于WHERE
子句的左侧,而不是使用别名。这将避免子查询外部查询结构。这是更多的打字,但它不是低效的;该函数在查询中出现两次,但实际上没有执行两次。Oracle引擎足够聪明,可以看到它是同一个函数,因此它只计算一次(对于每一行)。