我正在使用Oracle数据库和表
-----------------------------
ID : NAME
------------------------------
现在我需要知道有多少名字跟随嬉戏条件
我写了查询
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 A93$7AH 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 A93$7AH
10 A93@7AH
11 A93!7AH
12 A93~7AH
13 A93+7AH
答案 0 :(得分:1)
目前您的模式与名称中的任何字符匹配;它只会排除根本不包含任何这些范围的值,而不是排除包含任何其他值的值。因此,您需要使用^和$锚定模式,并添加一个量词以允许重复模式,使用*或?。因此模式变为'^[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, 'A93$7AH' 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然后说你确实也想要数字。
您还可以使用字母数字类而不是范围,这样可以更安全地处理其他语言(当然,取决于您想要匹配的内容):
WHERE REGEXP_LIKE (name, '^[[:alnum:]_]*$');
或Perl-influenced \ w运营商:
WHERE REGEXP_LIKE (name, '^\w*$');
或者非字操作符,它不需要锚定:
WHERE NOT REGEXP_LIKE (name, '\W');