Você precisa selecionar as linhas 1 e 2 e, em seguida, descobrir uma maneira de filtrar as linhas anteriores indesejadas - uma maneira é usar a agregação com um
CASE
instrução para corresponder apenas à segunda linha:SQL Fiddle
Configuração do esquema 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;
Consulta 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
Resultados :
| SECOND_ELEMENT |
|----------------|
| 2 |
| 5 |
Não está funcionando porque:para a primeira linha na consulta interna correlacionada,
ROWNUM
é 1
e seu filtro é WHERE ROWNUM = 2
então isso reduz para WHERE 1=2
e o filtro não corresponde e a linha é descartada. A linha subsequente será testada em relação a um ROWNUM
de 1
(já que a linha anterior não está mais na saída e não terá um número de linha), que novamente falhará no teste e será descartada. Repita, ad nauseum e todas as linhas falham no WHERE
filtram e são descartados.