我正在运行Oracle11g,试图查找记录中不包含下面列出的字符的所有条目。
有效字符列表:abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/
到目前为止,我得到的是:
SELECT * FROM Table1 WHERE NOT
REGEXP_LIKE(TRIM(UPPER(name1)),'abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/')谢谢。
发布于 2014-05-19 09:41:44
REGEXP_LIKE中的第二个参数是一个冗长的模式,从abc....到-/开始。由于您的表不太可能包含具有此模式的名称,因此它将不匹配任何行。NOT的存在将反转这一点,您将得到表中的所有行。
你应该在这里做的是匹配任何字符,而不是整体模式。所以你应该把它放在方括号里。
SELECT * FROM Table1
WHERE NOT REGEXP_LIKE(TRIM(UPPER(name1)),'[abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/]');但这只适用于只包含无效字符的名称。如果名称同时包含有效字符和无效字符,regex将匹配,而不将导致该行不显示。
因此,应该在方括号内使用^来排除有效字符,并从条件中删除NOT。
SELECT * FROM Table1
WHERE REGEXP_LIKE(TRIM(UPPER(name1)),'[^abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/]');这将只匹配那些包含regex中不存在的字符的名称。
您可以通过使用:alnum:或\w字符类进一步简化这一点。这将匹配所有的字母和数字。你也可以去掉上面的函数。
SELECT * FROM Table1
WHERE REGEXP_LIKE(TRIM(name1),'[^[:alnum:].,’&-/]');示例:
SQL> with x(y) as (
select 'y.s&'||'d' from dual union all
select '4rc y' from dual union all
select 'üe' from dual union all
select 'æøå' from dual union all
select 'Z%' from dual union all
select '!' from dual
)
SELECT * FROM x
WHERE REGEXP_LIKE( TRIM(y),'[^[:alnum:].,’&-/]');
Y
------
4rc y
Z%
!更新:
https://stackoverflow.com/questions/23733097
复制相似问题