我有一个字段FARMBOL,它包含我需要拆分的信息。 在该领域的某个时刻,它会说“IMPORTER:”,然后是更多的信息。
I.E。,“20394823409 IMPORTER:John Doe”
我需要将“20394823409”提取为一个字段,将“IMPORTER:John Doe”提取为另一个字段。我怎样才能做到这一点?该代码是Oracle DB上SSRS中查询的一部分。
答案 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
如果你需要一个更灵活的模式,那么你可以使用正则表达式,但这似乎有点过分了。
必须这样做表明你应该真正将这些数据存储在单独的列中,可能使用不同的数据类型,而不是将它们拼凑在一个字符串列中。