首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在VARRAY中找到值

如何在VARRAY中找到值
EN

Stack Overflow用户
提问于 2017-10-11 05:56:35
回答 3查看 315关注 0票数 1

我已经在一个表中创建了一个VARRAY (下面),我想询问一个标题是否有一个特定的主题,例如。表演“行动”游戏。我不知道该怎么做.

代码语言:javascript
复制
CREATE OR REPLACE TYPE Theme_Game AS OBJECT
(Theme VARCHAR(20));
/ 
CREATE OR REPLACE TYPE Theme_Type AS VARRAY(3) OF Theme_Game;
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT
(Title VARCHAR2(50),
GameTheme Theme_Type);
/
CREATE TABLE Game_Table of Game_Type
/
INSERT INTO Game_Table
VALUES('Star Wars' ,(Theme_Type(Theme_Game('Action'), Theme_Game('FPS'))))
/
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-11 06:52:58

您需要使用table()函数在FROM子句中公开嵌套的表。然后可以引用集合的属性:

代码语言:javascript
复制
SQL> select g.title
  2  from game_table g
  3       , table(g.gametheme) gt
  4  where gt.theme = 'Action';

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

SQL> 

“如果我随后需要检索具有多个主题的行(例如,动作,FPS),该怎么办?”

为这个笨拙的解决方案道歉,但我现在得去工作了。稍后我可能会发布一个更优雅的解决方案。

代码语言:javascript
复制
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> 

由于VARRAY不支持member of,因此此替代方法无法适用于当前类型。但是,如果集合是嵌套表,它就能工作。

代码语言:javascript
复制
 select g.title
  from game_table g
  where  'Action' member of g.gametheme
  and 'FPS' member of g.gametheme
票数 1
EN

Stack Overflow用户

发布于 2017-10-11 07:41:43

对于多个主题,您可以这样做

代码语言:javascript
复制
select g.Title
from game_table g, table(g.gameTheme) t
where t.Theme in ('FPS','Action')
group by g.Title having count(0) = 2;

这也可以让你做的事情,如得到标题与确切的n匹配,至少n匹配,最多n匹配.

票数 0
EN

Stack Overflow用户

发布于 2017-10-13 10:53:35

可以使用集合,然后使用SUBMULTISET运算符比较多个项:

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
CREATE OR REPLACE TYPE Theme_Game AS OBJECT
(Theme VARCHAR(20));
/ 
CREATE OR REPLACE TYPE Theme_Type AS TABLE OF Theme_Game;
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT(
  Title VARCHAR2(50),
  GameTheme Theme_Type
);
/
CREATE TABLE Game_Table of Game_Type
NESTED TABLE GameTheme STORE AS GameTheme_Tab
/
INSERT INTO Game_Table
VALUES('Star Wars' ,(Theme_Type(Theme_Game('Action'), Theme_Game('FPS'))))
/

查询1

代码语言:javascript
复制
SELECT *
FROM   game_table
WHERE  Theme_Type(Theme_Game('Action'), Theme_Game('FPS'))
       SUBMULTISET OF GameTheme

结果

代码语言:javascript
复制
|     TITLE |                                             GAMETHEME |
|-----------|-------------------------------------------------------|
| Star Wars | oracle.sql.STRUCT@67e8dc0f,oracle.sql.STRUCT@795b6d4c |

但是,当Theme_Game对象只有一个VARCHAR2属性时,为什么要使用它呢?您可以只使用VARRAY(3) OF VARCHAR2(20)TABLE OF VARCHAR2(20)而不使用中间对象:

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
CREATE OR REPLACE TYPE Varchar20List AS TABLE OF VARCHAR2(20);
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT(
  Title VARCHAR2(50),
  GameTheme Varchar20List
);
/
CREATE TABLE Game_Table of Game_Type
NESTED TABLE GameTheme STORE AS GameTheme_Tab
/
INSERT INTO Game_Table
VALUES('Star Wars' , Varchar20List('Action', 'FPS'))
/

查询1

代码语言:javascript
复制
SELECT *
FROM   game_table
WHERE  Varchar20List('Action','FPS')
       SUBMULTISET OF GameTheme

结果

代码语言:javascript
复制
|     TITLE |  GAMETHEME |
|-----------|------------|
| Star Wars | Action,FPS |

如果您想用VARRAY来完成它,那么:

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
CREATE OR REPLACE TYPE Varchar20List AS VARRAY(3) OF VARCHAR2(20);
/
CREATE OR REPLACE TYPE Game_Type AS OBJECT(
  Title VARCHAR2(50),
  GameTheme Varchar20List
);
/
CREATE TABLE Game_Table of Game_Type
/
INSERT INTO Game_Table
VALUES('Star Wars' , Varchar20List('Action', 'FPS'))
/

查询1

代码语言:javascript
复制
SELECT *
FROM   game_table g
WHERE  2 >= ( SELECT COUNT(*)
              FROM   TABLE( g.GameTheme ) a
                     INNER JOIN
                     TABLE( Varchar20List( 'Action', 'FPS' ) ) b
                     ON ( a.COLUMN_VALUE = b.COLUMN_VALUE )
             )

结果

代码语言:javascript
复制
|     TITLE |  GAMETHEME |
|-----------|------------|
| Star Wars | Action,FPS |

或者:

查询2

代码语言:javascript
复制
SELECT *
FROM   game_table g
WHERE  2 >= ( SELECT COUNT(*)
              FROM   TABLE( g.GameTheme ) a
              WHERE  a.COLUMN_VALUE IN ( 'Action', 'FPS' )
             )

结果

代码语言:javascript
复制
|     TITLE |  GAMETHEME |
|-----------|------------|
| Star Wars | Action,FPS |
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46680792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档