sql >> Databasteknik >  >> RDS >> Oracle

Hur man hittar om ett värde finns inom en VARRAY

Du måste exponera den kapslade tabellen i FROM-satsen med table() fungera. Du kan sedan referera till samlingens attribut:

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

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

SQL> 

"tänk om jag sedan behövde hämta rader med flera teman, t.ex. Action, FPS?"

Ber om ursäkt för den klumpiga lösningen men jag måste gå till jobbet nu. Jag kanske lägger upp en mer elegant lösning senare.

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> 

Detta alternativa tillvägagångssätt fungerar inte med din nuvarande typ eftersom VARRAY inte stöder member of . Men det skulle fungera om samlingen var ett kapslat bord.

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


  1. Dynamisk Oracle Pivot_In_Clause

  2. Okänd kolumn i "fältlista"-fel på MySQL Update-fråga

  3. Öka ett databasfält med 1

  4. Att ignorera dubbletter av nycklar under 'copy from' i postgresql