【问题标题】:SQL Server 2008, searching for special charactersSQL Server 2008,搜索特殊字符
【发布时间】:2013-03-25 09:39:53
【问题描述】:

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

我见过类似的问题,例如 Query for finding rows with special characters

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

我尝试过使用类似的东西

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

但它会返回每一条记录。


编辑

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

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

【问题讨论】:

  • +1 对我来说这个问题似乎没问题 - 不知道为什么它被标记为 -1
  • @whytheq,谢谢,我不太清楚为什么我在这个问题上得到了如此多的反对票。显然,没有一个反对的选民愿意评论为什么:(

标签: sql sql-server sql-server-2008


【解决方案1】:

试试

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

您的版本中 - 符号的位置似乎会导致问题。

【讨论】:

  • 刚看到你的帖子。事实上,连字符的位置是一个问题。我把它移到了我射程的前面。我还删除了反斜杠,因为它们显然也没有必要。
【解决方案2】:

使用双重否定

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

样本数据也很有用

【讨论】:

  • 这不是问题,我的正则表达式匹配集开头的 ^ 字符意味着不包含在以下内容中。例如,当我运行 ... WHERE name LIKE '%[^0-9a-zA-Z ]%' 我得到一个空的结果集,正如我所期望的那样。在这里,我还试图筛选出连字符、句点和 @ 字符,所以我的语法中有些地方不太正确。
  • @bigtunacan:你试过了吗?此外,LIKE 不是正则表达式。您只需要转义左括号stackoverflow.com/questions/3661125/…
  • 对不起,你说得对,它不是正则表达式,但它的作用类似于正则表达式范围的有限子集。范围开头的 ^ 字符表示仅匹配范围中不包含的内容,如 Microsoft 官方文档msdn.microsoft.com/en-us/library/ms179859.aspx 中所示
  • @bigtunacan:你试过了吗?
  • 对不起;是的,我尝试删除 ^ 并使用 NOT,结果是一样的。我在 Microsoft 文档中注意到一个示例,他们在范围内使用连字符,并且它位于开头。所以我尝试将我的范围从 '%[^0-9a-zA-Z -@.]%' 更改为 '%[^-0-9a-zA-Z @.]%'。这给了我预期的结果。也许这在某处记录了连字符必须在开头;如果是这样,我错过了,但无论如何它都有效。
【解决方案3】:

大概,每封电子邮件都有一个@ 字符以及.。你可以试试:

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

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

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

【讨论】:

  • 对不起;在原始问题中输入连字符时忘记转义。即使连字符转义,它仍然返回所有结果。我还删除了逗号,因为这对于电子邮件字段来说是不必要的。我已经更新了我上面的问题;问题还是一样。
猜你喜欢
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多