Musíte vybrat řádky 1 a 2 a pak vymyslet způsob, jak odfiltrovat nechtěné předchozí řádky – jedním ze způsobů je použití agregace s CASE
příkaz, aby odpovídal pouze druhému řádku:
Nastavení schématu 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;
Dotaz 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
Výsledky :
| SECOND_ELEMENT |
|----------------|
| 2 |
| 5 |
Nefunguje, protože:pro první řádek v korelovaném vnitřním dotazu ROWNUM
je 1
a váš filtr je WHERE ROWNUM = 2
pak se to sníží na WHERE 1=2
a filtr se neshoduje a řádek se zahodí. Následující řádek pak bude testován proti ROWNUM
z 1
(protože předchozí řádek již není ve výstupu a nebude mít číslo řádku), což opět neprojde testem a bude zahozeno. Opakuji, nevolnost a všechny řádky nesplňují WHERE
filtr a jsou vyřazeny.