regexp_substr 找到两个字母的单词

regexp_substr Finding two letter words

我在 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 之后。 同样在某些情况下 Postal code 不存在。

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

这里是如何找到最后一个由两个字母组成的子字符串,前面是 space,后面是 space 或字符串的结尾:

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

正则表达式查找单个 space 后跟两个字母后跟 space 或字符串结尾。在 .* 之前保证我们找到最后一次这样的事件。然后 REGEXP 函数 returns 只是两个字母(第二对括号中的模式部分,从左数;这就是 REGEXP_SUBSTR 最后一个参数的含义)。

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

这只是数学家答案的一种排列。由于我们已经定义了相对较短的状态代码列表,我们可以将状态代码(来自 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' 要求大小写匹配。

未确定此案例要求,但根据提供的示例看起来是一致的。

更多解释:

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

-我检查两个字母代码前的 space 或逗号。从您的示例中,您总是在州代码之前有一个 space。

-我检查 space 或在州代码之后结束的列。