【问题标题】:regexp_substr Finding two letter wordsregexp_substr 查找两个字母的单词
【发布时间】:2017-12-08 06:10:34
【问题描述】:

我在 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

【问题讨论】:

  • 你的标题说的是别的东西:它说“找到两个字母字”。地址中可能有两个字母单词,它们不是州代码(例如,Hilltop Av - Av 是“Avenue”的缩写,不是州代码;甚至是您的示例中的 ST!)。所以:你想找到州代码吗?你如何区分它们?它们总是地址中的最后两个字母吗?地址是否总是包含州代码? (否则您可能会在我的示例中选择“Av”,或者在您的示例中选择 ST,并认为它是状态代码。)
  • 标题有点误导。是的,州代码将始终在地址中。 ST 和 WA 都是州代码。所以我想看看我是否可以从字符串末尾提取两个字母的单词。这是我最好的机会
  • 我知道!所以:你在寻找最后两个字母的单词吗?以及如何定义“单词”——你可能有类似“London SQ1”之类的东西——所以你不能只查找前面和后面跟着一个非字母的两个字母。状态码之前总是空格,后面是空格还是字符串结尾?

标签: oracle regexp-substr


【解决方案1】:

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

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

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

【讨论】:

  • 完美。这有很大帮助。谢谢
【解决方案2】:

在模式参数中放置美国州缩写代码(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”要求大小写匹配。

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

更多解释:

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

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

-我检查状态代码之后的空格或列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多