回答

收藏

ORA-00904解码别名上的无效标识符

技术问答 技术问答 56 人阅读 | 0 人回复 | 2023-09-13

尝试decode在select语句中使用a的别名时,我遇到了标题中所述的错误。这是代码:
6 {9 y, E! V# t! h) lSELECT DISTINCT rl.complaint_date,
0 R' O$ \$ M  d: G* T                  decode(rl.judgement_date,null,rl.complaint_amt,rl.judgement_amt) as account_amt,
: E3 ~2 O5 S- A& L+ L9 N                  rl.date_served1,
% _3 h. U6 Q, d                  rl.date_served2,/ p. I% J+ E2 T5 H. D' @$ n3 r
                  rl.judgement_date,         % E6 i! Z5 c9 Y9 a
                  rl.skip_locate,
/ }. K1 {' ]+ M" f4 k! a3 @                  rl.case_no,
8 a: [$ `( w- P/ g, h                  lcc.bal_range_min,
2 F6 Y+ C# U6 r! ~) Q# x; K                  lcc.bal_range_max,
# E$ l; l0 n0 W% N$ H: {: ^                  lcc.cost_range_min, & V' K* z" Z& Q$ F( d& F
                  lcc.cost_range_max,
2 H, p" L4 Z. h; @1 L" b! Z) O                  lcc.court,- Z  A3 n, g6 V7 v
                  lcc.county AS lcc_county,1 H+ V8 l0 s; o* o/ I
                  ah.ACCOUNT,
1 K0 P. ], H( R                  ah.transaction_code, % }* h) `1 q+ |( I
                  ah.transaction_date,
* D2 e7 I! m- Q- ]2 m                  ah.rule_id,
0 O% i2 U: L5 k; ]! r& s+ [                  ah.amount, 4 i1 d4 O5 l2 W
                  ah.description,                    
3 X8 G8 j( q$ b" W+ f, S                  r.state, 0 m$ G0 Y% H2 I5 K
                  r.zip_code,
: e) l! p' [6 x5 W- w7 s                  z.county AS ah_county,
; A& n2 ?! N- |) C- g$ j                  z.county_2,$ b+ v9 ^8 c* f$ ?9 l/ W
                  z.county_3,
0 D" e# `' }% K# l- s/ Z1 U2 I! M                  z.county_4, x3 C+ H  |8 C; G8 g
  FROM legal_address_skip las,  X: P$ L8 B( u3 M4 c& `
       racctrel r, % g7 v) J) g9 c  f  G2 e
       ziplist z, ; n1 K- w. ]6 x% l- @8 Q! n
       legal_court_cost lcc, & d1 @! ~( p# k: T2 v; |. b
       racctlgl rl,5 ~( |3 H5 a, ^0 C
       legal_transaction_review ah
+ @( j& l% {6 U! e  WHERE ah.ACCOUNT = rl.ACCOUNT3 H) M& f2 p& t0 V
  AND ah.ACCOUNT = las.ACCOUNT(+)
: k+ c& b3 K, B, D- x. n  AND ah.ACCOUNT = r.ACCOUNT
4 Q" U: Y: E  _) f1 [  F  AND nvl(lpad(substr(r.zip_code,0,instr(r.zip_code,'-')-1),5,0), substr(r.zip_code,1,5)) = z.zip * Y* r  N% V8 U
  AND r.state = lcc.state
" m; x) H7 g( B& ]* s4 [6 f! d  AND (REPLACE(lcc.county,' ','') = REPLACE(upper(z.county),' ','')
3 {3 Q. V6 m5 s* _- V; M9 b       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_2),' ','')
2 x, q! Y. W% Q8 a8 B% _  a       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_3),' ','')
# X+ p) b3 k( j$ N       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_4),' ',''))" Z# l: R) J* j; c; o" P$ Y8 o5 `
  AND lcc.transaction_code = ah.transaction_code9 \- O! Z! z8 H# I% n7 b  ?
  AND lcc.transaction_code = 1
8 w5 s, `  R7 M  AND lcc.end_date IS NULL
, y- k$ n: K- |1 z2 b  AND ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max
; m1 c4 ~' M& f% E1 W* l1 a) C) }  AND (account_amt NOT BETWEEN lcc.bal_range_min AND lcc.bal_range_max* V; A, P6 X, Z2 w/ l
      OR lcc.bal_range_min - account_amt NOT BETWEEN 0 AND 500)# B5 k6 g1 k7 x$ h8 X2 k
  ORDER BY CASE 2 @7 J4 S& F. R4 E! s4 E
           WHEN ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 1
8 U4 E8 u# H/ ^7 ]0 ?: l- P; b           WHEN ah.amount BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 2 END, ah.amount;: p/ F% D9 c) D
我之前在select语句中使用过别名,因此我对为什么会收到此错误感到困惑。在这种情况下,它的工作方式是否有所不同?
, M' L  @* b4 p) b, U                ! t/ i, W$ x) r
解决方案:
/ X' _; |9 o* k  h/ O1 N# ]               
' X/ s7 j7 B6 H5 W4 X. B$ \9 u3 ?1 v' u7 f4 P; C* d6 T
; u$ Y3 @" y9 u. ^7 D2 o' \% F
                在文档中(添加了重点):4 `; j: n% ^2 {  s. U( `$ @2 h
( ~3 t- R; N  @3 q) f4 ]& `. N4 o
您可以使用列别名c_alias来标记选择列表中紧接的前一个表达式,以便以新标题显示该列。别名在查询期间有效地重命名了选择列表项。
3 B4 f. K6 h, B% {$ q9 D: v别名可以在ORDER BY子句中使用,但不能在查询中的其他子句中使用。
* r7 o) U: {) ^% \" {( c: }/ I% d9 s+ P) h$ [
因此,您无法在where子句中引用别名,该子句现在位于:$ ~; {/ k4 u& i. \! K: e3 k- w0 ^
...
; }) W9 O" J% Y) @AND (account_amt NOT BETWEEN ...# R+ K2 Y% G3 h$ W& s! r
...: i9 s8 M9 q$ w% t6 O4 w
别名当时无效,因此它正在其中一个表中查找具有该名称的列,但未找到该列。order by虽然很好。
' n1 G0 @) |5 T1 p% y: Y您可能需要用重复的decode语句替换别名,或者可能使用子查询,然后where在外部查询的子句中引用别名,但这最终可能会降低效率,具体取决于您对其他条件的选择程度。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则