我將通過逗號分隔值傳遞給oracle中的存儲過程。我希望把這些值作爲一個表,這樣我可以像查詢中使用它們:在oracle中處理逗號分隔值的好方法
select * from tabl_a where column_b in (<csv values passed in>)
什麼是在11g中做到這一點的最好方法是什麼?
現在我們正在逐一循環並將它們插入到我認爲效率低下的gtt中。
任何指針?
我將通過逗號分隔值傳遞給oracle中的存儲過程。我希望把這些值作爲一個表,這樣我可以像查詢中使用它們:在oracle中處理逗號分隔值的好方法
select * from tabl_a where column_b in (<csv values passed in>)
什麼是在11g中做到這一點的最好方法是什麼?
現在我們正在逐一循環並將它們插入到我認爲效率低下的gtt中。
任何指針?
這解決了完全相同的問題
Oracle不附帶內置標記器。但是可以使用SQL類型和PL/SQL來推出我們自己的。我已在this other SO thread中發佈了一個示例解決方案。
這將使這樣一個解決方案:
select * from tabl_a
where column_b in (select *
from table (str_to_number_tokens (<csv values passed in>)))
/
在11g中,您可以使用REGEXP_SUBSTR的「發生」參數來直接選擇值在SQL中:
select regexp_substr(<csv values passed in>,'[^,]+',1,level) val
from dual
connect by level < regexp_count(<csv values passed in>,',')+2;
B因爲regexp_substr有點貴,我不確定它是否是最快速的最有效的。
但在該解決方案中,你永遠不會顯示'str_to_number_tokens'看起來像什麼? – dmitry 2010-06-15 22:00:20
@dmitry - 也許我太微妙了,但是在「我正在使用Anup Pani的實現變體」一句中嵌入了一個鏈接,即http://anuppani.blogspot.com/2007/07/tokenizer-in-oracle -plsql.html – APC 2010-06-16 01:17:59