2013-09-30 32 views
2

我在我的select語句中嘗試使用decode的別名時遇到標題中指出的錯誤。下面是代碼:ORA-00904解碼別名上的無效標識符

SELECT DISTINCT rl.complaint_date, 
        decode(rl.judgement_date,null,rl.complaint_amt,rl.judgement_amt) as account_amt, 
        rl.date_served1, 
        rl.date_served2, 
        rl.judgement_date,   
        rl.skip_locate, 
        rl.case_no, 
        lcc.bal_range_min, 
        lcc.bal_range_max, 
        lcc.cost_range_min, 
        lcc.cost_range_max, 
        lcc.court, 
        lcc.county AS lcc_county, 
        ah.ACCOUNT, 
        ah.transaction_code, 
        ah.transaction_date, 
        ah.rule_id, 
        ah.amount, 
        ah.description,      
        r.state, 
        r.zip_code, 
        z.county AS ah_county, 
        z.county_2, 
        z.county_3, 
        z.county_4 
    FROM legal_address_skip las, 
     racctrel r, 
     ziplist z, 
     legal_court_cost lcc, 
     racctlgl rl, 
     legal_transaction_review ah 
    WHERE ah.ACCOUNT = rl.ACCOUNT 
    AND ah.ACCOUNT = las.ACCOUNT(+) 
    AND ah.ACCOUNT = r.ACCOUNT 
    AND nvl(lpad(substr(r.zip_code,0,instr(r.zip_code,'-')-1),5,0), substr(r.zip_code,1,5)) = z.zip 
    AND r.state = lcc.state 
    AND (REPLACE(lcc.county,' ','') = REPLACE(upper(z.county),' ','') 
     OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_2),' ','') 
     OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_3),' ','') 
     OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_4),' ','')) 
    AND lcc.transaction_code = ah.transaction_code 
    AND lcc.transaction_code = 1 
    AND lcc.end_date IS NULL 
    AND ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max 
    AND (account_amt NOT BETWEEN lcc.bal_range_min AND lcc.bal_range_max 
     OR lcc.bal_range_min - account_amt NOT BETWEEN 0 AND 500) 
    ORDER BY CASE 
      WHEN ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 1 
      WHEN ah.amount BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 2 END, ah.amount; 

我以前用過的別名在SELECT語句中,所以我爲什麼我得到一個錯誤,這個困惑。在這種情況下它的工作方式不同嗎?

+0

查詢使用AND(account_amt NOT BETWEEN'在WHERE子句中。是否有任何表包含名爲'account_amt'的列? – krokodilko

回答

5

From the documentation(強調):

您可以使用列別名,c_alias,來標記立即 前面的表達式在選擇列表中,這樣的列是一個新的標題顯示 。別名在查詢期間有效地重命名選擇 列表項。 該別名可用於 ORDER BY子句中,但不能用於查詢中的其他子句。

所以你不能指別名where子句,其中此刻的你在:

... 
AND (account_amt NOT BETWEEN ... 
... 

別名是在這一點上無效,所以它找在其中一個表中有該名稱的列,並且找不到一個。雖然在order by沒問題。

你要麼需要反覆decode語句替換別名,或者可能使用子查詢,然後參考別名在where子句中的外部查詢,但可能最終會被低效率取決於如何選擇你的其他條件是。

+0

啊啊好吧,感謝您清理混淆! – user2405778

3

Oracle在下面的順序選擇查詢:

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

基於上述內容,您可以看到當您位於WHERE部分時,別名尚未創建。如果你想用結果從SELECT部分​​,你可以通過修改你這樣的查詢:

WITH q AS 
(
-- Your query without the extra AND 
) 
SELECT * 
FROM q 
WHERE --put your check here 

這樣你就已經有別名可當你到達WHERE部分。

希望這會有所幫助! :)

+0

感謝您的幫助提示! – user2405778