String 拆分传递给存储过程的数字字符串,并在表中执行查找

String 拆分传递给存储过程的数字字符串,并在表中执行查找,string,oracle,plsql,split,String,Oracle,Plsql,Split,我必须将数字字符串(如234567、678956、345678)传递给存储过程,SP将用逗号分隔符拆分该字符串,并获取每个值(例如:234567),然后在另一个表中查找,从另一列中获取相应的值,并构建一个字符串 例如,如果有一个表,TableA有3列Column1,Column2,和Column3,数据如下: 1 123456 XYZ 2 345678 ABC 我将向存储过程传递一个数字字符串,例如'123456','345678'。然后,它将拆分这组数字,取第一个数字-123456,在表

我必须将数字字符串(如234567、678956、345678)传递给存储过程,SP将用逗号分隔符拆分该字符串,并获取每个值(例如:234567),然后在另一个表中查找,从另一列中获取相应的值,并构建一个字符串

例如,如果有一个表,
TableA
有3列
Column1
Column2
,和
Column3
,数据如下:

1 123456 XYZ 
2 345678 ABC 
我将向存储过程传递一个数字字符串,例如
'123456','345678'
。然后,它将拆分这组数字,取第一个数字-123456,在
表a
中查找,并从
第3列
中获取匹配值,即“XYZ”

我需要使用拆分的数字字符串('12345','345678')遍历表,并返回连接的字符串,如“XYZ ABC”

我正试图在Oracle 11g中实现这一点


任何建议都会很有帮助。

如果可能的话,在一条语句中完成所有事情几乎总是更有效的,也就是说,如果可以避免,就不要使用函数

有一个小技巧,你可以用来解决这个问题,把你的字符串变成有用的东西

with the_string as ( 
  select '''123456'', ''345678''' as str
    from dual
         )
 , the_values as (
 select regexp_substr( regexp_replace(str, '[^[:digit:],]')
                     , '[^,]+', 1, level ) as val
   from the_string
connect by regexp_substr( regexp_replace(str, '[^[:digit:],]')
                        , '[^,]+', 1, level ) is not null
        )
 select the_values.val, t1.c
   from t1
   join the_values 
     on t1.b = the_values.val
这样做可以去除所有的东西,除了你需要的数字和一些可以分割它们的东西,逗号。然后用逗号将其拆分,并使用分层查询将其转换为一列,然后使用该列进行连接

这是一个演示


请注意,当在大型数据集上使用时,这是非常低效的。如果您能正常地将变量传递给函数,可能会更好…

您能提供更多详细信息,或者提供一些伪代码和/或现有的表结构吗。顺便说一句,你试过什么?如果你在谷歌上搜索oracle拆分功能,你会得到很多点击率,因为人们已经实现了自己的
split()
。谢谢你的快速回复。它确实有效,但正如你建议的那样,我会使用一个函数;如果你不这样做会更快。我建议你不要传递连接字符串,如果你可以避免的话。我必须传递数字字符串,所以,我没有选择,是吗?如果你不知道要传递的数字的数量,那么你可能没有选择,我会尽一切可能不这样做,尽管@user2379643。您只需将此查询放入函数中即可。。。