Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL选择_Sql_Oracle - Fatal编程技术网

Oracle SQL选择

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

我编写了一个简单的查询来比较日期,但是在查询的最后一行出现了一个无效的标识符错误。我得到下面的错误。第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-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引擎足够聪明,可以看到它是同一个函数,因此它只计算一次(对于每一行)。