Oracle
 sql >> Base de données >  >> RDS >> Oracle

Accéder au 2ème élément dans la colonne varray

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 :

SQL Fiddle

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

Résultats :

| 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.