Sql 针对正则表达式的Oracle db查询未给出正确的结果
我正在使用Oracle数据库和表Sql 针对正则表达式的Oracle db查询未给出正确的结果,sql,database,oracle10g,Sql,Database,Oracle10g,我正在使用Oracle数据库和表 ----------------------------- ID : NAME ------------------------------ 现在我需要知道有多少名字跟在福林条件后面 可以包含A到Z 可以包含a到z 能容纳_ 我有书面询问 SELECT * FROM REGEX_TEST WHERE REGEXP_LIKE (name,'[A-Za-z0-9_]') 但这并没有给我正确的结果 我想要的样品结果 ID Text Ex
-----------------------------
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
//------------结果-----------
此时,您的模式匹配名称中的任何字符;它将只排除不包含任何这些范围的值,而不是您似乎想要排除包含任何其他内容的值。因此,您需要使用^和$锚定模式,并添加一个量词以允许模式重复,使用*或?。因此,模式变为“
”^[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时说你也需要数字
您还可以使用字母数字类而不是Range,它可以更安全地处理其他语言(当然,这取决于您希望匹配的语言):
或\w运算符:
WHERE REGEXP_LIKE (name, '^\w*$');
或者不需要锚定的not word运算符:
WHERE NOT REGEXP_LIKE (name, '\W');
Sow样本数据、您得到的结果和预期结果。还有ddl。聚合函数COUNT用于计算行数。您的意思是可以包含A-Z、A-Z、0-9,但不能包含其他字符?您希望返回失败行(包含失败文本)还是根本不返回?@jarlh:(1)是的,我只需要A-Z A-Z和Z(2)我不希望结果包含失败文本,但我希望所有将通过的结果
WHERE REGEXP_LIKE (name, '^\w*$');
WHERE NOT REGEXP_LIKE (name, '\W');