【问题标题】:How to detect a number and split in MS Access?如何在 MS Access 中检测号码并拆分?
【发布时间】:2015-06-03 14:30:50
【问题描述】:

目前我无法控制这些情况,所以请多多包涵。

我从名为 EMAIL_O 的字段中提取电子邮件地址,有时它们是完全有效的 (somename@domain.com),有时它们有 12 个字符的电话号码附加在前面 (123-456-7890somename@domain.com)。

如何在 MS Access 中检测我看到的字段类型并在提取此数据时适当地删除电话号码?我不能只取第 13 个字符的 mid(),因为如果电子邮件有效,我会删除好的字符。

所以我需要以某种方式检测数字的存在,然后应用mid(),或者如果不存在数字则只取完整的字段。

【问题讨论】:

  • 一个人可以拥有 23Somename@domain.com 吗?虽然我看到这个问题被标记为 SQL,但您是否也愿意接受 VBA 中的建议?
  • 不,电子邮件地址永远不会以数字开头。不过,有时电子邮件字段可能是空白的。

标签: sql string ms-access


【解决方案1】:

使用模式匹配来检查 EMAIL_O 是否以电话号码开头。

EMAIL_O = "123-456-7890somename@domain.com"
? EMAIL_O Like "###-###-####*"
True

EMAIL_O = "somename@domain.com"
? EMAIL_O Like "###-###-####*"
False

因此,您可以在 IIf 表达式中使用该策略。当 EMAIL_O 匹配模式时应用 Mid。否则,只需原封不动地返回 EMAIL_O

? IIf(EMAIL_O Like "###-###-####*", Mid(EMAIL_O, 13), EMAIL_O)
somename@domain.com

这些是从立即窗口复制的示例。如果您想在查询中使用相同的方法...

SELECT IIf(EMAIL_O Like "###-###-####*", Mid(EMAIL_O, 13), EMAIL_O) AS email
FROM YourTable;

【讨论】:

  • 啊,我之前尝试过模式匹配,但方法不对。不知道你可以使用“#”!谢谢。
【解决方案2】:

使用 Left 和 IsNumeric 函数,您可以检查第一个字符是否为数字,如下所示。 (未经测试的代码)。

Public Function CheckEmail(strEmail As String)

    If IsNumeric(Left(strEmail, 1)) Then
        strEmail = Right(strEmail, Len(strEmail - 13))
        CheckEmail = strEmail
    Else
        CheckEmail = strEmail
    End If

End Function

【讨论】:

    【解决方案3】:

    您可以使用正则表达式来完成这项工作。假设电子邮件前面的数字格式具有动态长度,您将无法按照您的建议从第 13 个字符开始。尝试使用 RegEx 进行模式匹配和替换。这将消除整个字符串查找/切割/连接操作

    试试这个:

    Public Function FN_GET_EMAIL(iEmail As String) As String
        Const mPattern As String = "^[0-9_-]+[0-9_-]"
    
        With CreateObject("vbscript.RegExp")
            .Pattern = mPattern
            .Global = True
    
            FN_GET_EMAIL = Nz(.Replace(iEmail, ""), "")
        End With
    
    End Function
    

    样本结果:

    ?FN_GET_EMAIL("123123123-123123123123-1231231231231EmailWith1123123Number@domain.com")
    EmailWith1123123Number@domain.com
    ?fn_get_email("123-456-7890somename@domain.com")
    somename@domain.com
    

    此外,您可以添加适当的电子邮件验证,甚至可以根据需要更改模式,而无需执行复杂的字符串操作。

    【讨论】:

      【解决方案4】:

      您可以检查数字标题:

      If IsNumeric(Replace(Left(Nz([Email]), 12), "-", "")) Then
          ' chop 12 chars
      Else
          ' use as is
      End If
      

      【讨论】:

      • 由于某种原因,此解决方案在我尝试时会产生数据不匹配错误
      • 您可能有 Null 值。如果是这样,Nz 应该处理它(已编辑)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多