在oracle中使用regexp提取子字符串

时间:2018-12-06 18:35:53

标签: sql regex oracle regexp-substr

我有这个表现

(CONJ|ADL|ALD|ALM|ATR|VRD)(.)*{1,6}(TERPLN|SUITE|AGP|ALM|PT|$)

要提取

CL 18 A SUR 29 C 80 VRD LOS ARBOLES PT 20 

我需要提取'VRD LOS ARBOLES PT',但使用REGEXP_SUBSTR返回'VRD LOS ARBOLES PT 20 '

请帮助我

REGEXP_SUBSTR('CL 18 A SUR 29 C 80 VRD LOS ARBOLES PT 20','(CONJ|ADL|ALD|ALM|ATR|VRD)(.)*{1,6}(TERPLN|SUITE|AGP|ALM|PT|$)' )

1 个答案:

答案 0 :(得分:0)

您可能正在寻找这样的东西:

with
  inputs as (
    select 'CL 18 A SUR 29 C 80 VRD LOS ARBOLES PT 20' address from dual
  )
select regexp_substr(address, 
       '(CONJ|ADL|ALD|ALM|ATR|VRD).*?(TERPLN|SUITE|AGP|ALM|PT|$)') token
from   inputs
;

TOKEN
---------------------
VRD LOS ARBOLES PT

关键是交替之间的含义-在这种情况下为.*?

但是,请注意,这是一种危险方法-如果街道名称(或其他名称)实际上包含子字符串PT,该怎么办?

VRD康普顿谷

搜索将返回VRD COMPT

,问题出在您的数据模型,而不是您在此类数据上使用的特定查询。也许您可以要求在最后的变更之前必须留有空格;但即使那样,您在类似

的输入中也会得到错误的答案

VRD庭园