-1

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

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

1 123456 XYZ 
2 345678 ABC 

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

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

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

任何的意见都将会有帮助。

4

1 回答 1

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作为演示。

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

于 2013-05-29T19:47:49.713 回答