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

时间:2013-05-29 16:52:34

标签: string oracle plsql split

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

例如,如果有一个表格,TableA包含3列Column1Column2Column3,其数据如下:

1 123456 XYZ 
2 345678 ABC 

我会将一串数字传递给存储过程,例如'123456', '345678'。然后它将分割这些数字并取第一个数字 - 123456并在TableA中查找并从Column3获得匹配值 - 即'XYZ'。

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

我正在尝试在Oracle 11g中执行此操作。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

如果可能的话,在单个语句中执行所有操作几乎总是更有效,即如果可以避免使用,则不要使用函数。

使用REGEXP_SUBSTR()可以使用一个小技巧来解决此问题,将您的字符串转换为可用的字符串。

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

除了您需要的数字以及将它们分开的东西(逗号)之外,这可以删除所有内容。然后将其拆分为逗号并使用分层查询将其转换为一个列,然后您可以使用该列进行连接。

这是一个SQL Fiddle作为演示。

请注意,在大型数据集上使用时效率非常低。如果你将变量正常传递给你的函数可能会更好......