1

假设有一个带有可变数组列的表,定义如下:

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。请让我知道我是否忘记了什么或造成一些混乱。

4

1 回答 1

3

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

SQL小提琴

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

结果

| 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并且过滤器不匹配并且该行被丢弃。随后的行将针对 a ROWNUMof进行测试1(因为前一行不再在输出中并且没有行号),这将再次失败并被丢弃。重复,令人作呕,所有行都未能通过WHERE过滤器并被丢弃。

于 2018-07-17T12:37:27.633 回答