查找特定字符和/或字符串SQL Server 2008

时间:2014-12-16 21:14:42

标签: sql sql-server string sql-like

我有两列包含电子邮件信息。 A列,B列。现在,在这些字段中,电子邮件应该是这样的:

 Column A                 Column B
 x@x.com; b@b.com         abc@x.com; xyz@x.com
 x@x.com;b@b.com          abc@x.com;xyz@x.com

然而,为了进行一些数据质量检查等,事实证明许多条目不遵循这种格式。我试图找到所有异常值,并且我已经确定了异常值,因此采用了这种形式:

x@x.com and b@b.com
x@x.com, b@b.com (uses comma so it is incorrect)
x@x.com or b@b.com
x@x.com / b@b.com

可能有其他错误的字符或单词使格式不正确。但我希望这些例子可以找出问题所在。

我想做什么: 创建一个查询,以查明所有不正确格式的实例,以便以后可以找到并编辑问题点,但这是一个不同的主题:)

这是我到目前为止的查询:

SELECT     A_EMAIL, B_EMAIL, NAME, ID
FROM         NAMES

WHERE A_EMAIL LIKE ('and %') OR A_EMAIL LIKE ('or %') 
OR B_EMAIL LIKE ('and %') OR B LIKE ('or %')

这是使用LIKE,%之间有空格。但是,这没有返回结果,我知道这样的结果确实存在。但是我想建立一个逻辑,它可以把所有不正确格式的东西带回来,而不是试图使用LIKE' XYZ'因为即使我知道大部分问题,我仍然可以错过一些。

但是,如果通过SQL无法做到这一点。然后我仍然希望得到我目前使用LIKE(' XYZ%')的逻辑来代替,即使不是最佳路线,也应该能够帮助我实现目标。

4 个答案:

答案 0 :(得分:3)

我建议您删除空格,然后查找非电子邮件字符:

where replace(cola, '; ', ';') like '%[^a-zA-Z0-9@ ;.]%'

也就是说,该列包含无效字符。

然后,我建议您创建一个联结表,这样就不会以分号分隔的列存储电子邮件列表。

答案 1 :(得分:1)

您的查询没问题,您错过了一个%。 而不是这个

WHERE A_EMAIL LIKE ('and %') OR A_EMAIL LIKE ('or %') 
OR B_EMAIL LIKE ('and %') OR B LIKE ('or %')

你应该使用这个

WHERE A_EMAIL LIKE ('%and %') OR A_EMAIL LIKE ('%or %') 
OR B_EMAIL LIKE ('%and %') OR B LIKE ('%or %')

您的原始查询会查找以'和'开头的值,而您感兴趣的是'和'出现在列值的任何位置。

当然,这是解决您眼前问题的一次性解决方案。 永久的解决方案不是首先在同一列中存储几封电子邮件。

答案 2 :(得分:0)

尝试这样的事情

Create Table #Emails (Email varchar(128))
Go

Insert into #Emails
Values 
  ('goodguy@greatdomain.com')
, ('another.great.email@somemailserver.somedaomain.com')
, (Null)
, ('a@b.c')
, ('a@b.c and x@y.z')
, ('x@x.com and b@b.com')
, ('x@x.com, b@b.com')
, ('x@x.com or b@b.com')
, ('x@x.com / b@b.com')
Go

Select 
  Email
, Case 
    When Email Is Not Null 
     And LTrim(RTrim(Email)) Like '%_@__%.__%' 
     And LTrim(RTrim(Email)) Not Like '% %' 
        Then 'Good' 
        Else 'Bad' 
  End Quality
From #Emails

原创[BAD]

不完美,但请选择如下声明。好的机会会让你占多数

NOT LIKE '%_@__%.__%

答案 3 :(得分:0)

我相信一个简单的不喜欢查询就足以满足您的要求,如下所示

Select * From EmailTable Where Email NOT LIKE '%;%'