Vous devez sélectionner les lignes 1 et 2, puis trouver un moyen de filtrer les lignes précédentes indésirables - une façon consiste à utiliser l'agrégation avec un CASE déclaration pour ne correspondre qu'à la deuxième ligne :
Configuration du schéma 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;
Requête 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 |
Cela ne fonctionne pas car :pour la première ligne de la requête interne corrélée, ROWNUM est 1 et votre filtre est WHERE ROWNUM = 2 alors cela se réduit à WHERE 1=2 et le filtre n'est pas mis en correspondance et la ligne est ignorée. La ligne suivante sera ensuite testée par rapport à un ROWNUM de 1 (puisque la ligne précédente n'est plus dans la sortie et n'aura pas de numéro de ligne), qui échouera à nouveau au test et sera rejetée. Répétez, ad nauseum et toutes les lignes échouent le WHERE filtrer et sont ignorés.