Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como descobrir se existe um valor dentro de um VARRAY


Você precisa expor a tabela aninhada na cláusula FROM usando o table() função. Você pode então referenciar atributos da coleção:
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 eu precisasse recuperar linhas com vários temas, ou seja, ação, FPS?"

Peço desculpas pela solução desajeitada, mas preciso ir trabalhar agora. Posso postar uma solução mais elegante mais tarde.
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> 

Essa abordagem alternativa não funcionará com seu tipo atual porque VARRAY não suporta member of . Mas funcionaria se a coleção fosse uma tabela aninhada.
 select g.title
  from game_table g
  where  'Action' member of g.gametheme
  and 'FPS' member of g.gametheme