访问varray列中的第二个元素

时间:2018-07-17 12:17:46

标签: sql oracle oracle11g varray

假设有一个带有varray列的表,定义如下:

create or replace TYPE VARRAY_NUMBER_LIST AS VARRAY(15) OF NUMBER;

现在,我正在尝试选择表中每个varray列的第一个元素。效果很好:

select (select * from table(myvarraycolumn) where rownum = 1) from mytable cc 

它返回的输出如下:

2
1
4
4
2
2

当我尝试使用此SQL获取每个varray列的第二个元素时,会发生我的问题:

select (select * from table(myvarraycolumn) where rownum = 2) from mytable cc 

在这种情况下,所有输出行都返回null。请让我知道我是否忘记了一些东西或感到困惑。

1 个答案:

答案 0 :(得分:2)

您需要选择第1行和第2行,然后找出一种方法来过滤掉前面不需要的行-一种方法是将聚合与CASE语句一起使用以仅匹配第二行:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE mytable ( myvarraycolumn ) AS
  SELECT SYS.ODCINUMBERLIST( 1, 2, 3 ) FROM DUAL UNION ALL
  SELECT SYS.ODCINUMBERLIST( 4, 5, 6 ) FROM DUAL;

查询1

SELECT (
         SELECT MAX( CASE ROWNUM WHEN 2 THEN COLUMN_VALUE END )
         FROM   TABLE( t.myvarraycolumn )
         WHERE  ROWNUM <= 2
       ) AS second_element
FROM   mytable t

Results

| SECOND_ELEMENT |
|----------------|
|              2 |
|              5 |
  

当我尝试使用此SQL获取每个varray列的第二个元素时,会发生我的问题:

select (select * from table(myvarraycolumn) where rownum = 2) from mytable cc 
     

在这种情况下,所有输出行都返回null。请让我知道我是否忘记了一些东西或感到困惑。

之所以不起作用,是因为:对于相关内部查询中的第一行,ROWNUM1,而过滤条件为WHERE ROWNUM = 2,则该值减少为WHERE 1=2,并且过滤器不匹配,该行被丢弃。然后,将针对ROWNUM中的1测试下一行(因为前一行不再在输出中并且将没有行号),这将再次使测试失败并被丢弃。重复一遍,广告异常和所有行均未通过WHERE过滤器,并被丢弃。