Oracle
 sql >> Database >  >> RDS >> Oracle

Come scoprire se esiste un valore all'interno di un VARRAY

Devi esporre la tabella annidata nella clausola FROM usando table() funzione. Puoi quindi fare riferimento agli attributi della raccolta:

SQL> select g.title
  2  from game_table g
  3       , table(g.gametheme) gt
  4  where gt.theme = 'Action';

TITLE
--------------------------------------------------
Star Wars

SQL> 

"e se avessi bisogno di recuperare righe con più temi, ad esempio Azione, FPS?"

Mi scuso per la soluzione goffa, ma ora devo andare al lavoro. Potrei pubblicare una soluzione più elegante in seguito.

SQL> select * from game_table
  2  /

TITLE
--------------------------------------------------
GAMETHEME(THEME)
--------------------------------------------------------------------------------
Star Wars
THEME_TYPE(THEME_GAME('Action'), THEME_GAME('FPS'))

Uncharted 3
THEME_TYPE(THEME_GAME('Action'), THEME_GAME('Puzzle'))

Commander Cody
THEME_TYPE(THEME_GAME('Fun'), THEME_GAME('Puzzle'))


SQL> select g.title
  2  from game_table g
  3       , table(g.gametheme) gt
  4       , table(g.gametheme) gt1
  5  where gt.theme = 'Action'
  6  and gt1.theme = 'FPS' ;

TITLE
--------------------------------------------------
Star Wars

SQL> 

Questo approccio alternativo non funzionerà con il tuo tipo attuale perché VARRAY non supporta member of . Ma funzionerebbe se la collezione fosse una Nested Table.

 select g.title
  from game_table g
  where  'Action' member of g.gametheme
  and 'FPS' member of g.gametheme