sql >> Base de Datos >  >> RDS >> Oracle

Cómo encontrar si existe un valor dentro de un VARRAY

Debe exponer la tabla anidada en la cláusula FROM usando table() función. A continuación, puede hacer referencia a los atributos de la colección:

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

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

SQL> 

"¿Qué pasa si luego necesito recuperar filas con varios temas, es decir, acción, FPS?"

Disculpas por la solución torpe, pero necesito ir a trabajar ahora. Puede que publique una solución más elegante más adelante.

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> 

Este enfoque alternativo no funcionará con su tipo actual porque VARRAY no es compatible con member of . Pero funcionaría si la colección fuera una tabla anidada.

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