我在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
有时状态代码WA
在Postal Code
之前,有时在之后。
在某些情况下,Postal code
也不存在。
在所有这些情况下需要帮助来提取WA
。
答案 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'要求大小写匹配。
此案例要求未被识别,但看起来基于提供的样本是一致的。
更多解释
- 我的匹配模式使用三个字符分组,我在子表达式参数中引用第二个。
- 我检查两个字母代码前面的空格或逗号。从您的示例中,您始终在州代码之前有一个空格。
- 我检查一个空格或在州代码之后结束的列。