7

我正在尝试查找已插入表中的一些错误数据。可能是有人从 Word 复制/粘贴然后插入数据库。

我已经看到了类似的问题,例如 Query for find rows with special characters

但这并不适合我所需要的。本质上,我只想返回一个不包含任何标准字符的数据集并捕获诸如 endash 之类的东西(仅一个示例)。

我试过用这样的东西

SELECT * FROM mytable WHERE email LIKE '%[^0-9a-zA-Z \-@\.]%'

但它会返回每一条记录。


编辑

以防它对以后出现的其他人有好处。最终,我遇到的问题是由于连字符 (-) 字符的放置,正如下面的 sgmoore 所指出的那样。我将它移到了我的范围的开头,就在非 (^) 字符之后。

此外,根据 gbn 提供的 LIKE 实际上并未使用正则表达式的信息,我在这里重新访问了 Microsoft 文档SQL Server LIKE Statement。由于我假设它与正则表达式相同,因此我不必要地使用反斜杠字符作为转义字符。这些是不必要的,显然只有通配符才需要转义字符。我链接的文档还提到在 LIKE 范围之后使用 ESCAPE 子句来指定要用作转义字符的字符,例如 WHERE percent_complete LIKE '%50!%' ESCAPE '!' 将匹配实际上以 50% (50%, 150%) 结尾的字符串。

这是我最终用来筛选我的电子邮件数据中的坏字符的方法;对我来说它有效,但它可能并不适用于所有情况。

SELECT * FROM mytable WHERE email LIKE '%[^-0-9a-zA-Z_@.]%'

如果它有帮助,我需要在其他几个通用文本字段上做类似的事情;这远非全面,但它将我的结果集缩小到只有少数记录,然后我能够直观地确定我在寻找什么。

SELECT * from mytable WHERE text_field LIKE '%[^-0-9a-zA-Z @.''?:/,+&();_]%'

4

3 回答 3

5

尝试

SELECT * FROM mytable WHERE email LIKE '%[^0-9a-zA-Z @\.\-]%'

看起来您的版本上 - 符号的位置会导致问题。

于 2013-04-03T16:46:39.840 回答
1

使用双重否定

... WHERE email NOT LIKE '%[^0-9a-zA-Z ,-@\.]%'

样本数据也会很有用

于 2013-04-03T15:56:52.070 回答
1

据推测,每封电子邮件都有一个@字符以及.. 你可以试试:

SELECT * FROM mytable WHERE email LIKE '%[^0-9a-zA-Z ,\]%'

如果您的原始列表是您真正想要的,那么您需要转义-

SELECT * FROM mytable WHERE email LIKE '%[^0-9a-zA-Z ,\-@\.]%'
于 2013-04-03T15:57:23.467 回答