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.