regexp_substr找到两个字母的单词

时间:2017-12-07 15:16:41

标签: oracle regexp-substr

我在Oracle中有一个地址字段,我需要提取状态代码。

select  '111 BROADWAY ~ ST LOUIS, WA 58585' from dual   
union  
select  '111 BROADWAY ~ ST LOUIS, WA' from dual  
union  
select  '111 BROADWAY ~ ST LOUIS,58585 WA' from dual

有时状态代码WAPostal Code之前,有时在之后。 在某些情况下,Postal code也不存在。

在所有这些情况下需要帮助来提取WA

2 个答案:

答案 0 :(得分:1)

以下是如何找到由两个字母组成的最后一个子字符串,前面有一个空格,后跟一个空格或字符串的结尾:

select ...., 
       regexp_substr(address, '.*( ([[:alpha:]]{2})( |$))', 1, 1, null, 2) as state_code
...........

正则表达式查找单个空格,后跟两个字母,后跟空格或字符串的结尾。前面.*保证我们发现最后这种情况。然后REGEXP函数只返回两个字母(第二对括号中的模式部分,从左边开始计算;这是REGEXP_SUBSTR的最后一个参数的含义)。

答案 1 :(得分:0)

在模式参数中放置美国州缩写代码(2个字母)

这只是mathguy答案的一种排列。由于我们已经定义了相对较短的州代码列表,我们可以将状态代码(来自usps网站)放在模式参数中,并使用交替运算符将它们分开。

SCOTT@db>WITH tst AS (
  2      SELECT
  3          '111 BROADWAY ~ ST LOUIS, WA 58585' us_addrss
  4      FROM
  5          dual
  6      UNION ALL
  7      SELECT
  8          '111 BROADWAY ~ ST LOUIS, WA' us_addrss
  9      FROM
 10          dual
 11      UNION ALL
 12      SELECT
 13          '111 BROADWAY ~ ST LOUIS,58585 WA' us_addrss
 14      FROM
 15          dual
 16  ) SELECT
 17      regexp_substr(t.us_addrss,'( |,)(AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)( |$)' state_code
 18  ,1,1,'c',2)
 19    FROM
 20      tst t;
state_code
------
WA
WA
WA

其他2个字母的匹配将不包括在内。另外,我使用的匹配参数'c'要求大小写匹配。

此案例要求未被识别,但看起来基于提供的样本是一致的。

更多解释

- 我的匹配模式使用三个字符分组,我在子表达式参数中引用第二个。

- 我检查两个字母代码前面的空格或逗号。从您的示例中,您始终在州代码之前有一个空格。

- 我检查一个空格或在州代码之后结束的列。