0

我有一个字段FARMBOL,它具有我需要拆分的信息。 在该领域的某个时刻,它会说“IMPORTER:”,后面是更多信息。需要提取Oracle SQL中子字符串之前/之后的所有内容

即“20394823409危害:李四”

我需要提取“20394823409”作为一个字段,以及“进口者:李四”的另一种。我怎样才能做到这一点?该代码是Oracle数据库中SSRS查询的一部分。

+0

你想实现什么逻辑?请阅读第一列的第一个空格以及第一个空格之后的所有内容。阅读第一个非数字字符?第一列第一个字母字符前的所有内容? –

+0

阅读直到字符串的“IMPORTER”部分作为第1列,“IMPORTER”以及后面的所有部分作为第2列。 –

+0

因此,每一行都将具有文字“IMPORTER”吗? –

回答

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 

如果你需要一个更灵活的模式,那么你可以使用正则表达式来代替,但是,似乎是矫枉过正这里。

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

+0

繁荣。谢啦。 –

相关问题