Du skal vælge række 1 og 2 og derefter finde en måde at filtrere de uønskede foregående rækker fra - én måde er at bruge aggregering med en CASE
sætning til kun at matche den anden række:
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;
Forespørgsel 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 |
Det virker ikke fordi:for den første række i den korrelerede indre forespørgsel, ROWNUM
er 1
og dit filter er WHERE ROWNUM = 2
så reduceres dette til WHERE 1=2
og filteret er ikke matchet, og rækken kasseres. Den efterfølgende række vil derefter blive testet mod en ROWNUM
af 1
(da den forrige række ikke længere er i outputtet og ikke vil have et rækkenummer), hvilket igen vil fejle testen og blive kasseret. Gentag, ad nauseum og alle rækker mislykkes WHERE
filter og kasseres.