如何确定varchar字段是否包含set中的字符

时间:2015-03-04 06:13:18

标签: sql sql-server-2008-r2

我需要确定db中varchar列中的所有行是否包含以下特定集合之外的任何字符:

abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ.-#,1234567890/\&%();:+@_*?|=''

我尝试了这个,但不确定它是否正确:

select AccName 
from Transactions 
where AccName not like '%[!abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ.-#,1234567890/\&%();:+@_*?|='']%'

这应该有用吗?

任何有用的帮助。

2 个答案:

答案 0 :(得分:0)

您不能在查询中的普通LIKE条件中使用正则表达式。如果要使用正则表达式,则必须使用特殊运算符。在MySQL中,您可以尝试以下方法:

SELECT AccName 
FROM Transactions 
WHERE AccName REGEXP [!abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ.-#,1234567890/\&%();:+@_*?|='']%';

如果这不能启动,那么你可能需要整理你给出的正则表达式。正如marc_s所问,确切的正则表达式和查询将取决于您使用的数据库系统。

答案 1 :(得分:-1)

数据库管理系统对匹配正则表达式的支持各不相同。下面的示例使用PostgreSQL,它支持POSIX正则表达式以及其他风格。下面的示例还测试区分大小写的匹配,以避免像#&#;;' Mike'与正则表达式#34;

不匹配

AFAIK,没有DBMS允许您将like运算符与正则表达式混合。

like形式的column_name like '%a%'表达式将匹配' a'如果它出现在列中的任何位置。但是您需要使用正则表达式来匹配列的整个值。将正则表达式锚定在每个值(^$)的开头和结尾处,并告诉dbms匹配原子的一个或多个实例(+)。

select 'Mike' ~ '^[a-zA-Z0-9]+$';  -- 'Mike' matches the regex

写一个失败的测试。

select 'Mike?' ~ '^[a-zA-Z0-9]+$';  -- 'Mike?' doesn't match the regex

将问号添加到正则表达式,并验证测试是否成功。

select 'Mike?' ~ '^[a-zA-Z0-9?]+$'; -- 'Mike?' matches the regex

为每个角色重复失败的测试和成功测试。当您捕获到所需的所有字符后,请使用!~运算符代替~运算符来反转逻辑。

当您的数据干净时将其移至CHECK约束中。


PostgreSQL pattern matching