【问题标题】:Need to extract everything before/after substring in Oracle SQL [duplicate]需要在 Oracle SQL 中提取子字符串之前/之后的所有内容 [重复]
【发布时间】:2016-10-15 14:51:48
【问题描述】:

我有一个字段 FAMBOL,其中包含我需要拆分的信息。 在该字段的某个位置,它会说“进口商:”,然后是一些更多信息。

即,“20394823409 进口商:John Doe”

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

【问题讨论】:

  • 你要实现的逻辑是什么?阅读第一列的第一个空格,并将第一个空格之后的所有内容作为第二个?读到第一个非数字字符?第一列第一个字母字符之前的所有内容?
  • 阅读直到字符串的“IMPORTER”部分作为第 1 列,“IMPORTER”和之后的所有内容作为第 2 列。
  • 那么每一行都会有文字“IMPORTER”吗?

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


【解决方案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

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

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

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

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

【讨论】:

  • 轰隆隆。谢谢,伙计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2019-02-17
  • 1970-01-01
  • 2019-02-11
  • 2010-12-23
  • 2015-06-06
  • 2019-08-08
相关资源
最近更新 更多