Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zugriff auf das zweite Element in der Varray-Spalte

Sie müssen die Zeilen 1 und 2 auswählen und dann einen Weg finden, die unerwünschten vorhergehenden Zeilen herauszufiltern – eine Möglichkeit besteht darin, die Aggregation mit einem CASE zu verwenden Anweisung nur mit der zweiten Zeile übereinstimmen:

SQL-Geige

Oracle 11g R2-Schema-Setup :

CREATE TABLE mytable ( myvarraycolumn ) AS
  SELECT SYS.ODCINUMBERLIST( 1, 2, 3 ) FROM DUAL UNION ALL
  SELECT SYS.ODCINUMBERLIST( 4, 5, 6 ) FROM DUAL;

Abfrage 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

Ergebnisse :

| SECOND_ELEMENT |
|----------------|
|              2 |
|              5 |

Es funktioniert nicht, weil:für die erste Zeile in der korrelierten inneren Abfrage ROWNUM ist 1 und Ihr Filter ist WHERE ROWNUM = 2 dann reduziert sich dies auf WHERE 1=2 und der Filter passt nicht und die Zeile wird verworfen. Die nachfolgende Zeile wird dann gegen eine ROWNUM getestet von 1 (da die vorherige Zeile nicht mehr in der Ausgabe enthalten ist und keine Zeilennummer hat), die den Test erneut nicht besteht und verworfen wird. Wiederholen, ad nauseum und alle Zeilen scheitern an WHERE filtern und werden verworfen.