正则表达式的 Oracle 数据库查询没有给出正确的结果
Oracle db query for regex is not giving correct result
我正在使用 Oracle 数据库并且 table
-----------------------------
ID : NAME
------------------------------
现在我需要知道有多少名字符合以下条件
- 可以包含 A 到 Z
- 可以包含 a 到 z
- 可以包含_
我已经写了查询
SELECT *
FROM REGEX_TEST
WHERE REGEXP_LIKE (name,'[A-Za-z0-9_]')
但这并没有给我正确的结果
我想要的示例结果
ID Text Expected result
1 PLAN_20001 PASS
2 A937AH PASS
3 556679815 PASS
4 A93_7AH PASS
5 PLANavd20001 PASS
6 A93*7AH FAIL
7 A93%7AH FAIL
8 A93^7AH FAIL
9 A93AH FAIL
10 A93@7AH FAIL
11 A93!7AH FAIL
12 A93~7AH FAIL
13 A93+7AH FAIL
//------------ 结果 ----------
1 PLAN20001
2 A937AH
3 556679815
4 A93 7AH
5 PLANavd20001
6 A93*7AH
7 A93%7AH
8 A93^7AH
9 A93AH
10 A93@7AH
11 A93!7AH
12 A93~7AH
13 A93+7AH
目前您的模式匹配名称中的任何字符;它只会排除根本不包含任何这些范围的值,而不是您似乎想要排除包含其他任何内容的值。因此,您需要使用 ^ 和 $ 来锚定模式,并使用 * 或 ? 添加量词以允许重复模式。所以模式变成 '^[A-Za-z0-9_]*$'
.
使用 CTE 来表示示例数据的演示:
WITH REGEX_TEST (id, name) AS (
select 1, 'PLAN20001' from dual
union all select 2,'A937AH' from dual
union all select 3, '556679815' from dual
union all select 4, 'A93 7AH' from dual
union all select 5, 'PLANavd20001' from dual
union all select 6, 'A93*7AH' from dual
union all select 7, 'A93%7AH' from dual
union all select 8, 'A93^7AH' from dual
union all select 9, 'A93AH' from dual
union all select 10, 'A93@7AH' from dual
union all select 11, 'A93!7AH' from dual
union all select 12, 'A93~7AH' from dual
union all select 13, 'A93+7AH' from dual
)
SELECT *
FROM REGEX_TEST
WHERE REGEXP_LIKE (name, '^[A-Za-z0-9_]*$');
ID NAME
---------- ------------
1 PLAN20001
2 A937AH
3 556679815
5 PLANavd20001
尽管你说了两次你只想要字母和下划线,但我还是保留了 0-9 的数字范围,因为你对 David Aldridge 的回复说你也想要数字。
您也可以使用字母数字 class 而不是您的范围,这样可以更安全地处理其他语言(当然取决于您要匹配的内容):
WHERE REGEXP_LIKE (name, '^[[:alnum:]_]*$');
或 Perl-influenced \w 运算符:
WHERE REGEXP_LIKE (name, '^\w*$');
或者不需要锚定的非词运算符:
WHERE NOT REGEXP_LIKE (name, '\W');
我正在使用 Oracle 数据库并且 table
-----------------------------
ID : NAME
------------------------------
现在我需要知道有多少名字符合以下条件
- 可以包含 A 到 Z
- 可以包含 a 到 z
- 可以包含_
我已经写了查询
SELECT *
FROM REGEX_TEST
WHERE REGEXP_LIKE (name,'[A-Za-z0-9_]')
但这并没有给我正确的结果
我想要的示例结果
ID Text Expected result
1 PLAN_20001 PASS
2 A937AH PASS
3 556679815 PASS
4 A93_7AH PASS
5 PLANavd20001 PASS
6 A93*7AH FAIL
7 A93%7AH FAIL
8 A93^7AH FAIL
9 A93AH FAIL
10 A93@7AH FAIL
11 A93!7AH FAIL
12 A93~7AH FAIL
13 A93+7AH FAIL
//------------ 结果 ----------
1 PLAN20001
2 A937AH
3 556679815
4 A93 7AH
5 PLANavd20001
6 A93*7AH
7 A93%7AH
8 A93^7AH
9 A93AH
10 A93@7AH
11 A93!7AH
12 A93~7AH
13 A93+7AH
目前您的模式匹配名称中的任何字符;它只会排除根本不包含任何这些范围的值,而不是您似乎想要排除包含其他任何内容的值。因此,您需要使用 ^ 和 $ 来锚定模式,并使用 * 或 ? 添加量词以允许重复模式。所以模式变成 '^[A-Za-z0-9_]*$'
.
使用 CTE 来表示示例数据的演示:
WITH REGEX_TEST (id, name) AS (
select 1, 'PLAN20001' from dual
union all select 2,'A937AH' from dual
union all select 3, '556679815' from dual
union all select 4, 'A93 7AH' from dual
union all select 5, 'PLANavd20001' from dual
union all select 6, 'A93*7AH' from dual
union all select 7, 'A93%7AH' from dual
union all select 8, 'A93^7AH' from dual
union all select 9, 'A93AH' from dual
union all select 10, 'A93@7AH' from dual
union all select 11, 'A93!7AH' from dual
union all select 12, 'A93~7AH' from dual
union all select 13, 'A93+7AH' from dual
)
SELECT *
FROM REGEX_TEST
WHERE REGEXP_LIKE (name, '^[A-Za-z0-9_]*$');
ID NAME
---------- ------------
1 PLAN20001
2 A937AH
3 556679815
5 PLANavd20001
尽管你说了两次你只想要字母和下划线,但我还是保留了 0-9 的数字范围,因为你对 David Aldridge 的回复说你也想要数字。
您也可以使用字母数字 class 而不是您的范围,这样可以更安全地处理其他语言(当然取决于您要匹配的内容):
WHERE REGEXP_LIKE (name, '^[[:alnum:]_]*$');
或 Perl-influenced \w 运算符:
WHERE REGEXP_LIKE (name, '^\w*$');
或者不需要锚定的非词运算符:
WHERE NOT REGEXP_LIKE (name, '\W');