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

Posted

技术标签:

【中文标题】在 oracle 中处理逗号分隔值的好方法【英文标题】:Good way to deal with comma separated values in oracle 【发布时间】:2010-06-15 20:47:50 【问题描述】:

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

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

在 11g 中最好的方法是什么?

现在我们正在一个一个地遍历这些并将它们插入到我认为效率低下的 gtt 中。

任何指针?

【问题讨论】:

【参考方案1】:

这解决了完全相同的问题

Ask Tom

【讨论】:

【参考方案2】:

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>)))
/

【讨论】:

但在那个解决方案中,您永远不会显示 str_to_number_tokens 的样子? @dmitry - 也许我太微妙了,但在“我正在使用 Anup Pani 的实现的变体”这句话中嵌入了一个链接,即anuppani.blogspot.com/2007/07/tokenizer-in-oracle-plsql.html【参考方案3】:

在 11g 中,您可以使用 REGEXP_SUBSTR 的“occurrence”参数直接在 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 有点贵,我不确定它是否是最快的最有效。

【讨论】:

以上是关于在 oracle 中处理逗号分隔值的好方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL 中求和逗号分隔值

如何在laravel中使用逗号分隔值的列上使用'where'

使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组

XSLT(2.0 或 3.0)方法将存储在 xml 中的每个逗号分隔值的整个 xml 复制到单独的 xml 文件中

包含逗号分隔值的列中的值

Oracle 行转列,逗号分隔