需要在Oracle SQL中的子字符串之前/之后提取所有内容

时间:2016-06-14 18:16:43

标签: oracle reporting-services ssrs-2008 oracle-sqldeveloper ssrs-2008-r2

我有一个字段FARMBOL,它包含我需要拆分的信息。 在该领域的某个时刻,它会说“IMPORTER:”,然后是更多的信息。

I.E。,“20394823409 IMPORTER:John Doe”

我需要将“20394823409”提取为一个字段,将“IMPORTER:John Doe”提取为另一个字段。我怎样才能做到这一点?该代码是Oracle DB上SSRS中查询的一部分。

1 个答案:

答案 0 :(得分:1)

如果它真的总是说' IMPORTER:'那么您可以使用substr()来获取子字符串,并使用instr()来计算得到多少:

with t (farmbol) as (select '20394823409 IMPORTER: John Doe' from dual)
select substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as part1,
  substr(farmbol, instr(farmbol, 'IMPORTER:')) as part2
from t;

PART1        PART2            
------------ ------------------
20394823409  IMPORTER: John Doe

您可以操纵提取的值,例如修剪第一部分的尾随空格,或者如果总是将它转换为数字:

with t (farmbol) as (select '20394823409 IMPORTER: John Doe' from dual)
select substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as part1,
  trim(substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1)) as part1_trim,
  cast(substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as number) as part1_num,
  substr(farmbol, instr(farmbol, 'IMPORTER:')) as part2
from t;

PART1        PART1_TRIM     PART1_NUM PART2            
------------ ----------- ------------ ------------------
20394823409  20394823409  20394823409 IMPORTER: John Doe

如果你真的不想保留“进口商”:'字符串的一部分,您可以通过固定值的长度调整第二个子字符串的起始位置:

with t (farmbol) as (select '20394823409 IMPORTER: John Doe' from dual)
select cast(substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as number) as part1_num,
  trim(substr(farmbol, instr(farmbol, 'IMPORTER:') + 9)) as importer
from t;

   PART1_NUM IMPORTER
------------ --------
 20394823409 John Doe

如果你需要一个更灵活的模式,那么你可以使用正则表达式,但这似乎有点过分了。

必须这样做表明你应该真正将这些数据存储在单独的列中,可能使用不同的数据类型,而不是将它们拼凑在一个字符串列中。