SQL Server 2008,搜索特殊字符

9
我正在尝试定位插入表中的一些坏数据,很可能是由于某人从Word复制/粘贴然后插入到数据库中造成的。
我看过类似的问题,比如查找仅包含特殊字符的行的查询,但这并不完全符合我的需求。本质上,我只想返回一个数据集,其中不包括任何标准字符,并捕获诸如endash(仅举一个例子)之类的内容。
我尝试使用类似于以下代码:
SELECT * FROM mytable WHERE email LIKE '%[^0-9a-zA-Z \-@\.]%'

但它会返回每一条记录。


编辑

如果对其他人有帮助,最终我遇到的问题是由于连字符(-)字符的位置导致的,正如sgmoore在下面指出的那样。我将其移动到范围的开头,紧随not (^)字符。

此外,根据gbn提供的信息,LIKE实际上并没有使用正则表达式,因此我重新访问了Microsoft文档SQL Server LIKE语句。我不必要地使用反斜杠字符作为转义字符,因为我假设它与正则表达式相同。这些是不必要的,显然通配符字符只需要转义字符。我链接的文档还提到,在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 @.''?:/,+&();_]%'


2
+1 对我来说看起来没问题,不确定为什么被标记为-1。 - whytheq
@whytheq,谢谢。我不太确定为什么我的这个问题会收到这么多的负评。显然,没有一个负评者愿意解释原因 :( - bigtunacan
3个回答

7

请尝试

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

看起来,您版本中减号的位置会导致问题。

刚看到你的帖子。确实连字符的位置是个问题。我把它移到了我的范围前面。同时,我也删除了反斜杠,因为它们显然是不必要的。 - bigtunacan

2
使用双重否定
... WHERE email NOT LIKE '%[^0-9a-zA-Z ,-@\.]%'

提供样本数据也是有用的


这不是问题,我的正则表达式匹配集开头的^字符表示以下内容不包含。例如,当我运行... WHERE name LIKE '%[^0-9a-zA-Z ]%'时,我得到了一个空结果集,这正是我所期望的。在这里,我还试图筛选连字符、句点和@字符,因此我的语法有些不对。 - bigtunacan
@bigtunacan:你试过了吗?此外,LIKE 不是正则表达式。你只需要转义开括号 https://dev59.com/BnA65IYBdhLWcg3wvhTi#3661145 - gbn
抱歉,您是正确的,它不是正则表达式,但类似于正则表达式范围的有限子集。范围开头的^字符表示仅匹配不包含在范围内的内容,如在官方微软文档中所示http://msdn.microsoft.com/en-us/library/ms179859.aspx。 - bigtunacan
@bigtunacan:你试过了吗? - gbn
抱歉,是的,我尝试过去掉^并使用NOT,结果是一样的。我注意到在Microsoft文档中有一个示例,他们在范围中使用连字符,并且它位于开头。所以我尝试将我的范围从'%[^0-9a-zA-Z -@.]%'更改为'%[^-0-9a-zA-Z @.]%'。这给了我期望的结果。也许这里有一个记录,即连字符必须在开头;如果是这样,我错过了,但无论如何它都有效。 - bigtunacan
另外,感谢指出这实际上不是正则表达式;我最初也尝试使用像在连字符和句点等正则表达式中一样的 \ 转义字符,但这些显然不是 SQL 范围中的特殊字符。 - bigtunacan

1

假设每封电子邮件都包含一个@字符和一个.字符。您可以尝试以下操作:

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

如果你真的想要原始列表,那么你需要转义 -
SELECT * FROM mytable WHERE email LIKE '%[^0-9a-zA-Z ,\-@\.]%'

抱歉,我在输入原始问题时忘记转义连字符了。即使转义了连字符,它仍然返回所有结果。我还删除了逗号,因为对于电子邮件字段来说是不必要的。我已经更新了我的问题,但问题仍然存在。 - bigtunacan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接