Du måste välja raderna 1 och 2 och sedan hitta ett sätt att filtrera bort de oönskade föregående raderna - ett sätt är att använda aggregering med en CASE
för att bara matcha den andra raden:
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;
Fråga 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
Resultat :
| SECOND_ELEMENT |
|----------------|
| 2 |
| 5 |
Det fungerar inte eftersom:för den första raden i den korrelerade inre frågan, ROWNUM
är 1
och ditt filter är WHERE ROWNUM = 2
sedan reduceras detta till WHERE 1=2
och filtret matchas inte och raden kasseras. Den efterföljande raden kommer sedan att testas mot en ROWNUM
av 1
(eftersom den föregående raden inte längre finns i utgången och inte kommer att ha något radnummer), vilket igen kommer att misslyckas i testet och kasseras. Upprepa, ad nauseum och alla rader misslyckas med WHERE
filter och kasseras.