在oracle中处理逗号分隔值的好方法

时间:2010-06-15 20:47:50

标签: oracle plsql tokenize

我将逗号分隔值传递给oracle中的存储过程。我想将这些值视为一个表,以便我可以在查询中使用它们:

select * from tabl_a where column_b in (<csv values passed in>)

在11g中执行此操作的最佳方法是什么?

现在我们逐个循环这些并将它们插入到我认为效率低下的gtt中。

任何指针?

3 个答案:

答案 0 :(得分:1)

Oracle没有内置的tokenizer。但是可以使用SQL Types和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>)))
/

答案 1 :(得分:1)

这解决了完全相同的问题

Ask Tom

答案 2 :(得分:0)

在11g中你可以使用&#34;发生&#34; 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;

但是由于regexp_substr有点昂贵,我不确定它是否是最快的方面。