访问可变数组列中的第二个元素
Posted
技术标签:
【中文标题】访问可变数组列中的第二个元素【英文标题】:Accessing 2th element in varray column 【发布时间】:2018-07-17 12:17:46 【问题描述】:假设有一个带有可变数组列的表,定义如下:
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】:您需要选择第 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。请让我知道如果我忘记了什么或造成一些混乱。
它不起作用,因为:对于相关内部查询中的第一行,ROWNUM
是 1
并且您的过滤器是 WHERE ROWNUM = 2
然后这减少到 WHERE 1=2
并且过滤器不匹配并且该行是丢弃。随后的行将针对1
的ROWNUM
进行测试(因为前一行不再在输出中并且没有行号),这将再次失败并被丢弃。重复,令人作呕,所有行都无法通过WHERE
过滤器并被丢弃。
【讨论】:
以上是关于访问可变数组列中的第二个元素的主要内容,如果未能解决你的问题,请参考以下文章