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
有时状态代码 WA
在 Postal 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 或在州代码之后结束的列。
我在 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
之后。
同样在某些情况下 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 或在州代码之后结束的列。