查询以从字符串中提取单词

时间:2019-11-19 09:12:13

标签: sql regex oracle oracle12c

我想从包含以下地址的地址字段(Oracle 12 C)中提取单词:-

str1:Abc.. Flat no - 8956, 8th road , Scramendo 4th street,Portland.
str2:Abcd.. Flat no Ad- 3434/89/69 Scramendo 4th street,Portland.

我的查询应该返回

  1. Flat no - 8956.(来自str1)
  2. Flat no Ad- 3434/89/69(来自str2)

基本上我想从庞大的数据行集中的字符串中提取平面编号

2 个答案:

答案 0 :(得分:2)

如果您的数据可能类似,则可以使用 regexp_substr()

根据帖子,我在您想要的输出中发现了一些相似之处,例如:

  1. Flat no开头
  2. digit
  3. 结尾
  4. ,并且只能包含一个特殊符号/

因此您可以基于它创建正则表达式

Flat no[A-z -]+[0-9/]+

能够匹配特定的子字符串

SELECT 
regexp_substr('Abc.. Flat no - 8956, 8th road ,
 Scramendo 4th street,Portland','Flat no[A-z -]+[0-9/]+') AS output FROM dual;

SELECT 
regexp_substr('Abcd.. Flat no Ad- 3434/89/69 Scramendo 4th street,Portland',
'Flat no[A-z -]+[0-9/]+') AS output FROM dual;

输出:

Flat no - 8956
Flat no Ad- 3434/89/69

demo

答案 1 :(得分:1)

下面的答案可以帮助解决问题-

select 
substr(x, instr(x, 'Flat no',1)) from (
select 
--regexp_substr('Abcd.. Flat no- 3434/89/69 Scramendo 4th street,Portland.', '[[Flat no- ][0-9]*+'),
--substr(
substr(
    'Abcd.. Flat no- 3434/89/69 Scramendo 4th street,Portland.', 1,
REGEXP_INSTR( 'Abcd.. Flat no- 3434/89/69 Scramendo 4th street,Portland.',
   '[a-zA-Z]'
 ,instr('Abcd.. Flat no- 3434/89/69 Scramendo 4th street,Portland.', '-'),1) - 1
 ) x --, instr('Abcd.. Flat no- 3434/89/69 Scramendo 4th street,Portland.'),1 )
from dual )