从字符串中提取电子邮件地址

时间:2015-12-11 14:58:54

标签: sql sql-server

我的表名为Entities,其中包含CustomData列。

我需要从每一行中提取电子邮件地址。 此外,如果value为null,我需要显示为null。

CustomData的示例行:

Id      CustomData                                                                                                                                                                                      Name
273     [{"Name":"Customer","Value":"test customer"},{"Name":"Address","Value":null},{"Name":"Email","Value":null},{"Name":"Company Name","Value":null},{"Name":"Other Phone","Value":null}]            2323123213
274     [{"Name":"Customer","Value":"Cash Sale"},{"Name":"Address","Value":null},{"Name":"Email","Value":"test@outlook.com"},{"Name":"Company Name","Value":null},{"Name":"Other Phone","Value":null}]  2222222222

这是我将用于更新系统的字符串。

我之前已经从这个相同的数据中选择了电话号码,但这是一个固定的长度。我似乎无法提取电子邮件地址。

我将在我的PC上发布一些迄今为止尝试过的不同方法

1 个答案:

答案 0 :(得分:1)

嗯,在这样的非规范化数据中,您唯一的选择是解析它并尝试收发电子邮件。最优雅的方式 - 是使用json解析器,但它在当前版本的sql server中是不可用的,所以你必须手动解析它。

假设每封电子邮件记录均以{"Name":"Email","Value":开头,您只需几步即可完成此操作:

  1. 在字符串中找到{"Name":"Email","Value":的位置。
  2. 在字符串的右侧剩余部分中找到}的第一次出现。
  3. 在中间获取子字符串。
  4. 检查字符串是否等于' null' - 然后返回null,否则返回字符串本身。
  5. 所以可以像在这个片段中那样完成:

    declare @data nvarchar(max), @pattern nvarchar(max)
    
    select @data = '[{"Name":"Customer","Value":"test customer"},
                     {"Name":"Address","Value":null},
                     {"Name":"Email","Value":null},
                     {"Name":"Company Name","Value":null},
                     {"Name":"Other Phone","Value":null}]'
    
    select @pattern = '{"Name":"Email","Value":'
    
    select nullif(substring(@data, 
                 charindex(@pattern, @data, 0) + len(@pattern),
                 charindex('}', @data, charindex(@pattern, @data, 0)) 
                    - charindex(@pattern, @data, 0) - len(@pattern)
                 ), 'null')