需要在 Oracle SQL 中提取所有 before/after 子字符串

Need to extract everything before/after substring in Oracle SQL

我有一个 FARMBOL 字段,其中包含我需要拆分的信息。 在该字段中的某个位置,它会显示 "IMPORTER:",然后是更多信息。

I.E.,“20394823409 进口商:John Doe”

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

如果它真的总是说'IMPORTER:'那么你可以用substr() to get the sub-strings, and 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

您可以操纵提取的值,例如修剪第一部分的尾随 space,或者将其转换为数字(如果它始终为:

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

如果您需要更灵活的模式,那么您可以改用正则表达式,但这在这里似乎有些矫枉过正。

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