È necessario selezionare le righe 1 e 2 e quindi trovare un modo per filtrare le righe precedenti indesiderate:un modo è utilizzare l'aggregazione con un CASE
istruzione in modo che corrisponda solo alla seconda riga:
Impostazione dello schema 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;
Query 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 |
Non funziona perché:per la prima riga della query interna correlata, ROWNUM
è 1
e il tuo filtro è WHERE ROWNUM = 2
quindi questo si riduce a WHERE 1=2
e il filtro non corrisponde e la riga viene eliminata. La riga successiva verrà quindi testata rispetto a un ROWNUM
di 1
(poiché la riga precedente non è più nell'output e non avrà un numero di riga), che fallirà nuovamente il test e verrà scartato. Ripeti, fino alla nausea e tutte le righe non superano il WHERE
filtro e vengono scartati.