回答

收藏

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

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

尝试decode在select语句中使用a的别名时,我遇到了标题中所述的错误。这是代码:( G8 }$ ]& x, s/ \9 c
SELECT DISTINCT rl.complaint_date,
/ w9 F5 P) D# Z6 i& T! W                  decode(rl.judgement_date,null,rl.complaint_amt,rl.judgement_amt) as account_amt,
1 U% o, C* z3 W6 |, ~0 z( ?: V                  rl.date_served1,
0 q$ s' P' e: Q" n; {$ A; m                  rl.date_served2,: `' k* x9 c% N& b" ^: {
                  rl.judgement_date,         
' K9 f! B) M: i2 H. `# M% M                  rl.skip_locate,
; z" }$ M( o* [2 H% n2 q* f                  rl.case_no,/ C4 t) M; f" v- ^/ h
                  lcc.bal_range_min,
0 X" |* v% M  l/ m. _                  lcc.bal_range_max,
" K) L. G; A6 O0 {/ y                  lcc.cost_range_min, # B& I/ Y6 m( A8 h
                  lcc.cost_range_max, 2 {' d0 q8 P- ^# a( v3 b
                  lcc.court,. R1 M1 R% e, u; B
                  lcc.county AS lcc_county,8 n4 C/ Y" F$ F
                  ah.ACCOUNT,
+ Q. r  Z) F, k1 Q, w8 E( K, A% p! L                  ah.transaction_code,
* M* V* k1 P( b" B                  ah.transaction_date, 2 D1 E( w6 O1 d* c+ R3 s
                  ah.rule_id,
) m# J. n) C, k3 F                  ah.amount,
$ S- f, m8 H2 C1 ^7 I& j* {                  ah.description,                    
5 s" K; g1 z8 g/ H9 k3 i+ O                  r.state, ! R/ C) J& R" P+ r; s
                  r.zip_code, 3 J( P1 ^% J0 L- w+ n1 Q
                  z.county AS ah_county,' @8 T2 ?! f3 h
                  z.county_2,6 W) W3 K5 n; Q5 t7 ~
                  z.county_3,8 |7 r+ q8 w9 ]5 K& O/ l
                  z.county_46 t1 H9 f: x$ t! S. y
  FROM legal_address_skip las,
# v3 A3 T- p0 F1 f6 m1 ]$ f       racctrel r, 7 r0 }) s! P& |; i) ?
       ziplist z,
0 A/ }. h6 l" u+ G! @* }       legal_court_cost lcc,
# R/ X' C7 s1 m+ ?! ^       racctlgl rl,% A. [+ g) u  D( q3 w
       legal_transaction_review ah8 _  L+ ]  j! b" b2 d# S
  WHERE ah.ACCOUNT = rl.ACCOUNT
! S1 |4 i8 P7 o, t7 f  AND ah.ACCOUNT = las.ACCOUNT(+)/ x$ S' ^" q$ y7 j4 L! I0 @# I2 A
  AND ah.ACCOUNT = r.ACCOUNT
/ d; V( ]$ `# `" |- s( @' u  AND nvl(lpad(substr(r.zip_code,0,instr(r.zip_code,'-')-1),5,0), substr(r.zip_code,1,5)) = z.zip 8 B* c' F+ R# W& q  Q5 w
  AND r.state = lcc.state9 R4 P$ w% l, G) K
  AND (REPLACE(lcc.county,' ','') = REPLACE(upper(z.county),' ','')
* d( `' z) N8 ^, w/ U       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_2),' ','')! l% h2 v& e) j  \5 ^+ l- q  T
       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_3),' ','')$ i& I  w9 n3 Y* L
       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_4),' ',''))6 f  Z1 c; i8 F5 B6 x' ~
  AND lcc.transaction_code = ah.transaction_code) {1 V8 j0 y4 |+ j4 j; _. T
  AND lcc.transaction_code = 1& f+ W3 z, ]* W9 b
  AND lcc.end_date IS NULL
9 k( i3 R  p, ^  AND ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max
& z6 l$ Z  s# D( m) t' x  AND (account_amt NOT BETWEEN lcc.bal_range_min AND lcc.bal_range_max* q. y. M! Y1 w: O' @
      OR lcc.bal_range_min - account_amt NOT BETWEEN 0 AND 500)% F# ^* f  E( T8 o/ ]1 M  p) V
  ORDER BY CASE
6 H% F; L  m4 n4 O  l5 Z           WHEN ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 1! {6 H* O- Y$ s- K. \9 U; F
           WHEN ah.amount BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 2 END, ah.amount;
% @% i  L% o. O  `+ G) f. \6 U7 e8 E我之前在select语句中使用过别名,因此我对为什么会收到此错误感到困惑。在这种情况下,它的工作方式是否有所不同?0 u) ]8 h( E" c1 g2 p- x% t
                , R; n: r4 r9 M% ^3 z
解决方案:9 A0 ^9 ?4 \7 d
               
/ n% N1 W0 q( b: e& P1 s( i; M  g  O( c, t, a6 p
. Z4 ^# }; a2 K
                在文档中(添加了重点):
! F* d  v: o/ @+ i0 r. P
: Q4 C1 K( g$ G* f  _您可以使用列别名c_alias来标记选择列表中紧接的前一个表达式,以便以新标题显示该列。别名在查询期间有效地重命名了选择列表项。3 q5 ]) G. K) }+ D
别名可以在ORDER BY子句中使用,但不能在查询中的其他子句中使用。
* U, S: n- M* S
8 c3 z8 T2 }+ x* Q3 y- A因此,您无法在where子句中引用别名,该子句现在位于:
' g' |2 c8 V6 p, K4 G$ j...% j5 h: o1 }/ q8 z* a$ |3 j
AND (account_amt NOT BETWEEN ...
8 V. D+ u! k1 h( e: K+ M...7 l/ G+ [# Q$ R' v" y& E
别名当时无效,因此它正在其中一个表中查找具有该名称的列,但未找到该列。order by虽然很好。2 \3 v3 E* h. Z9 x, S% J& ?/ T
您可能需要用重复的decode语句替换别名,或者可能使用子查询,然后where在外部查询的子句中引用别名,但这最终可能会降低效率,具体取决于您对其他条件的选择程度。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则