2017-05-24 58 views
0

我寫了一個簡單的查詢來比較日期,但我在查詢的最後一行收到無效的標識符錯誤。我在下面得到以下錯誤。第15行恰好是查詢的最後一行。Oracle SQL Select

行錯誤:15列:6

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 SD=(SELECT TO_CHAR(SYSDATE, 'DD-MM-YY') FROM DUAL) 

有什麼不對的標識?

回答

2

您不能在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> 
+0

@BreenDeen-進一步解釋Aleksej的答案:它總是幫助思考一個SQL語句中的子句的評估順序。至少原則上,FROM子句(包括JOIN條件)和WHERE子句在其他任何事情之前被評估,而SELECT子句被評估接近結束。 SELECT子句中定義的別名對WHERE子句不可見。數據庫軟件的創建者可以自由地做其他事情(比如稍後定義的任何別名的「預讀」),但我不知道是否有這樣做的具體操作,當然Oracle不。 – mathguy

+0

@BreenDeen - 作爲使用子查詢的替代方法,您可以在WHERE子句的左側重複整個TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY'),而不是使用別名。這將避免子查詢外部查詢結構。它更加打字,但效率並不高。該函數在查詢中出現兩次,但實際上並未執行兩次。 Oracle引擎足夠聰明,可以看到它是相同的函數,所以它只計算一次(對於每一行)。 – mathguy

+0

非常感謝! – BreenDeen

0

爲了詳細在接受的答案:

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)