我需要确定db中varchar列中的所有行是否包含以下特定集合之外的任何字符:
abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ.-#,1234567890/\&%();:+@_*?|=''
我尝试了这个,但不确定它是否正确:
select AccName
from Transactions
where AccName not like '%[!abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ.-#,1234567890/\&%();:+@_*?|='']%'
这应该有用吗?
任何有用的帮助。
答案 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约束中。