Sql 使用Oracle regexp查找精确长度为3的数字
我只想要456英镑 我尝试了这个正则表达式,但我得到了所有包含3位字符的数字,45646354376,等等Sql 使用Oracle regexp查找精确长度为3的数字,sql,regex,oracle,Sql,Regex,Oracle,我只想要456英镑 我尝试了这个正则表达式,但我得到了所有包含3位字符的数字,45646354376,等等 select regexp_substr(MY_COLUMN,'([[:digit:]]{3})') from MY_TABLE 你把号码串起来了。。。如果要搜索正好是3位数字的数字,请使用: 这假定您已将数字存储在数字列中。如果其中可能还有字符,请使用并确保将正则表达式绑定到字符串的开头(使用^运算符)和结尾($) select * from my_table where regexp
select regexp_substr(MY_COLUMN,'([[:digit:]]{3})') from MY_TABLE
你把号码串起来了。。。如果要搜索正好是3位数字的数字,请使用: 这假定您已将数字存储在数字列中。如果其中可能还有字符,请使用并确保将正则表达式绑定到字符串的开头(使用
^
运算符)和结尾($
)
select * from my_table where regexp_like( my_column, '^[[:digit:]]{3}$')
您没有检查您的数字是否在字符串的开头和结尾,因此您得到的都是3个数字。您正在对数字进行子字符串化。。。如果要搜索正好是3位数字的数字,请使用: 这假定您已将数字存储在数字列中。如果其中可能还有字符,请使用并确保将正则表达式绑定到字符串的开头(使用
^
运算符)和结尾($
)
select * from my_table where regexp_like( my_column, '^[[:digit:]]{3}$')
您没有检查您的数字是否在字符串的开头和结尾,因此您得到的都是3个数字。您可以使用以下模式:
(^|[^[:digit:]])([[:digit:]]{3})($|[^[:digit:]])
其中,
[^[:digit:]
是所有非数字,^
,$
是字符串锚定的开始和结束。您可以使用此模式:
(^|[^[:digit:]])([[:digit:]]{3})($|[^[:digit:]])
其中,
[^[:digit:]
是所有非数字的,而^
,$
是字符串锚定的开始和结束。我不太清楚您想要的是精确匹配还是子字符串匹配,因此我包含了各种选项:
Oracle 11g R2架构设置:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询1:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果您只需要MY_COLUMN
中正好包含3位数字的行,则可以使用包含在起始字符串(^
)和结束字符串($
)锚定中的正则表达式:
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询2:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
或者,如果您使用的是Oracle 11g,则可以使用不太详细的PERL语法:
SELECT MY_COLUMN
FROM MY_TABLE
WHERE REGEXP_LIKE( MY_COLUMN, '^\d{3}$' )
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询3:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取第一个3位数字(其中可以包含周围文本或更多数字),则:
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询4:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取第一个精确的3位数字,则:
SELECT MY_COLUMN,
REGEXP_SUBSTR( REGEXP_SUBSTR( MY_COLUMN, '(^|\D)\d{3}(\D|$)' ), '\d{3}' ) AS match
FROM MY_TABLE
WHERE REGEXP_LIKE( MY_COLUMN, '(^|\D)\d{3}(\D|$)' )
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询5:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取所有不重叠的3位数字(可以包含周围文本),则:
查询6:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要提取所有子匹配项(精确为3位数),则:
WITH re_counts AS (
SELECT MY_COLUMN,
REGEXP_COUNT( MY_COLUMN, '(^|\D)\d{3}(\D|$)' ) AS re_count
FROM MY_TABLE
)
,indexes AS (
SELECT LEVEL AS "index"
FROM DUAL
CONNECT BY LEVEL <= (SELECT MAX( re_count) FROM re_counts)
)
SELECT MY_COLUMN,
"index",
REGEXP_SUBSTR( REGEXP_SUBSTR( MY_COLUMN, '(^|\D)\d{3}(\D|$)', 1, "index" ), '\d{3}' ) AS match
FROM re_counts
INNER JOIN
indexes
ON ("index" <= re_count)
ORDER BY MY_COLUMN, "index"
查询7:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取所有3位数字,而不管这些匹配是否部分重叠,则:
WITH positions AS (
SELECT LEVEL AS pos
FROM DUAL
CONNECT BY LEVEL <= (SELECT MAX( LENGTH( MY_COLUMN ) - 2 ) FROM MY_TABLE )
)
SELECT MY_COLUMN,
pos,
SUBSTR( MY_COLUMN, pos, 3 )
FROM MY_TABLE
INNER JOIN
positions
ON (pos <= LENGTH( MY_COLUMN ) - 2 )
WHERE REGEXP_LIKE( SUBSTR( MY_COLUMN, pos, 3 ), '^\d{3}$' )
ORDER BY MY_COLUMN, pos
我不太清楚您是想要精确匹配还是子字符串匹配,因此我提供了各种选项: Oracle 11g R2架构设置:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询1:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果您只需要MY_COLUMN
中正好包含3位数字的行,则可以使用包含在起始字符串(^
)和结束字符串($
)锚定中的正则表达式:
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询2:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
或者,如果您使用的是Oracle 11g,则可以使用不太详细的PERL语法:
SELECT MY_COLUMN
FROM MY_TABLE
WHERE REGEXP_LIKE( MY_COLUMN, '^\d{3}$' )
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询3:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取第一个3位数字(其中可以包含周围文本或更多数字),则:
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询4:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取第一个精确的3位数字,则:
SELECT MY_COLUMN,
REGEXP_SUBSTR( REGEXP_SUBSTR( MY_COLUMN, '(^|\D)\d{3}(\D|$)' ), '\d{3}' ) AS match
FROM MY_TABLE
WHERE REGEXP_LIKE( MY_COLUMN, '(^|\D)\d{3}(\D|$)' )
:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
查询5:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取所有不重叠的3位数字(可以包含周围文本),则:
查询6:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要提取所有子匹配项(精确为3位数),则:
WITH re_counts AS (
SELECT MY_COLUMN,
REGEXP_COUNT( MY_COLUMN, '(^|\D)\d{3}(\D|$)' ) AS re_count
FROM MY_TABLE
)
,indexes AS (
SELECT LEVEL AS "index"
FROM DUAL
CONNECT BY LEVEL <= (SELECT MAX( re_count) FROM re_counts)
)
SELECT MY_COLUMN,
"index",
REGEXP_SUBSTR( REGEXP_SUBSTR( MY_COLUMN, '(^|\D)\d{3}(\D|$)', 1, "index" ), '\d{3}' ) AS match
FROM re_counts
INNER JOIN
indexes
ON ("index" <= re_count)
ORDER BY MY_COLUMN, "index"
查询7:
CREATE TABLE MY_TABLE (MY_COLUMN) AS
SELECT '456' FROM DUAL
UNION ALL SELECT '12345678' FROM DUAL
UNION ALL SELECT 'abc 123 def 456' FROM DUAL;
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN |
|-----------|
| 456 |
| MY_COLUMN | REGEXP_INSTR(MY_COLUMN,'\D{3}') | REGEXP_SUBSTR(MY_COLUMN,'\D{3}') |
|-----------------|---------------------------------|----------------------------------|
| 456 | 1 | 456 |
| 12345678 | 1 | 123 |
| abc 123 def 456 | 5 | 123 |
| MY_COLUMN | MATCH |
|-----------------|-------|
| 456 | 456 |
| abc 123 def 456 | 123 |
| MY_COLUMN | INDEX | REGEXP_SUBSTR(MY_COLUMN,'\D{3}',1,"INDEX") |
|-----------------|-------|--------------------------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 456 |
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | INDEX | MATCH |
|-----------------|-------|-------|
| 456 | 1 | 456 |
| abc 123 def 456 | 1 | 123 |
| abc 123 def 456 | 2 | 456 |
| MY_COLUMN | POS | SUBSTR(MY_COLUMN,POS,3) |
|-----------------|-----|-------------------------|
| 12345678 | 1 | 123 |
| 12345678 | 2 | 234 |
| 12345678 | 3 | 345 |
| 12345678 | 4 | 456 |
| 12345678 | 5 | 567 |
| 12345678 | 6 | 678 |
| 456 | 1 | 456 |
| abc 123 def 456 | 5 | 123 |
| abc 123 def 456 | 13 | 456 |
如果要从列中提取所有3位数字,而不管这些匹配是否部分重叠,则:
WITH positions AS (
SELECT LEVEL AS pos
FROM DUAL
CONNECT BY LEVEL <= (SELECT MAX( LENGTH( MY_COLUMN ) - 2 ) FROM MY_TABLE )
)
SELECT MY_COLUMN,
pos,
SUBSTR( MY_COLUMN, pos, 3 )
FROM MY_TABLE
INNER JOIN
positions
ON (pos <= LENGTH( MY_COLUMN ) - 2 )
WHERE REGEXP_LIKE( SUBSTR( MY_COLUMN, pos, 3 ), '^\d{3}$' )
ORDER BY MY_COLUMN, pos
my db table包含非数字字符,例如:row1->>im column456test row2->column4567839asdf row3->>ddffgg987qwert我想从第一行456和第三行987中获取这些行,感谢replySo REGEXP_LIKE()然后。。。我的db表包含非数字字符,例如:row1->>im column456test row2->column4567839asdf row3->>ddffgg987qwert,我想从第一行456和第三行987获得这些行,感谢replySo REGEXP_LIKE(),然后。。。它只是稍微慢一点而已。456不精确,但我想得到长度等于3的数字。在我的问题中,我得到了至少有3个长度的数字。但我想找到与Number的长度相等的长度。@robert:是的,我明白了,刷新你的页面。它工作正常,但我的数字左侧和右侧有双引号。你的模式得到“456”,有没有办法只得到456。谢谢@casimire etHippolyte@robertlennon:用空字符串替换所有非数字字符。456不精确,但我想得到长度等于3的数字。在我的问题中,我得到了至少有3个长度的数字。但我想找到与Number的长度相等的长度。@robert:是的,我明白了,刷新你的页面。它工作正常,但我的数字左侧和右侧有双引号。你的模式得到“456”,有没有办法只得到456。谢谢@casimire etHippolyte@robertlennon:用空字符串替换所有非数字字符。好的。我还有一个疑问。如何从字符串中提取所有数字。我正在尝试——选择REGEXP_SUBSTR('somestring-051-a92','[0-9]+..[0-9]+',1)--这给了我