我必须将一串数字(如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中执行此操作。
任何建议都会有所帮助。
答案 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作为演示。
请注意,在大型数据集上使用时效率非常低。如果你将变量正常传递给你的函数可能会更好......