2017-07-10 24 views
2

這看起來很簡單,但我無法在文檔中找到答案。獲取VARRAY集合中的元素索引

與嵌套表一樣,我們可以使用TABLE()COLUMN_VALUE僞列作爲變量。

create or replace type NUMBER_ARRAY as VARRAY(10) of NUMBER; 

create table TAB_WITH_ARRAY(
    ID NUMBER, 
    VALS NUMBER_ARRAY)  

insert into TAB_WITH_ARRAY 
select 1, NUMBER_ARRAY(1,2) 
from dual 
union all 
select 2, NUMBER_ARRAY(1,2,3,4,5) 
from dual 

select t.id, c.column_value 
from TAB_WITH_ARRAY t, 
    table(t.vals) c 

然而,與嵌套表,VARRAY是一個有序的集合類型,我想保留這個順序。有沒有辦法獲得不僅價值,而且還有SQL中每個元素的索引?


是的,在我的測試中輸出的順序是正確的,我可以只使用ROW_NUMBER與我主表PARTITION BY主鍵生成索引,但經驗告訴我不要依靠排序,除非手動指定它。

那麼有沒有一種內置的方式來訪問數組中的元素的索引?

+0

的可能的複製[我如何獲得的VARRAY項指標轉換爲表格後(https://stackoverflow.com/questions/10559647/how- do-i-get-the-index-of-varray-items-after-conversion-to-a-table) –

+0

謝謝@SudiptaMondal,這非常接近。但是,我很想看到1)完全的SQL解決方案,2)可以與一列數組一起工作的解決方案,而不是一個數組。 –

+0

也相關:https://stackoverflow.com/q/16713002/458741 – Ben

回答

1

使用ROW_NUMBER()解析函數:

SELECT t.id, 
     c.COLUMN_VALUE, 
     ROW_NUMBER() OVER (PARTITION BY t.ROWID ORDER BY ROWNUM) AS idx 
FROM TAB_WITH_ARRAY t 
     CROSS JOIN 
     TABLE(t.vals) c 
+1

這個'ORDER BY rownum'的東西很酷。我想我可以隔離這部分查詢並使用它來保留輸出的順序。 問題是我從來沒有在文檔中發現一個堅定的陳述,即TABLE()會按照元素存儲在數組中的順序輸出行。 除此之外,很好的答案!謝謝! –