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

问题描述:

我有一个名为Entities的表和CustomData列。从字符串中提取电子邮件地址

我需要从每一行中提取电子邮件地址。 此外,如果值为空,我需要显示为空。从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":"[email protected]"},{"Name":"Company Name","Value":null},{"Name":"Other Phone","Value":null}] 2222222222 

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

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

我会后一对夫妇不同的方法我都试过到目前为止一次,我回来了,在我的电脑

+1

嗨,你尝试过什么自己写? 'SELECT [???????????] FROM [Entities] WHERE [Id] = @ entityId'实际上并不是一种尝试。 –

+0

这是Json数据吗? – JsonStatham

+0

为什么你不在一列中存储分隔值的另一个例子。 –

那么,在这样的非规范化的数据您唯一的选择就是分析它,并尝试获取电子邮件。最优雅的方式 - 是使用json解析器,但在当前版本的sql server中并不令人满意,所以你必须手动解析它。

假设每个记录的电子邮件{"Name":"Email","Value":开始,你可以做到这一点在以下几个步骤:

  1. {"Name":"Email","Value":查找位置在您的字符串。
  2. 在字符串的右边余下找到}的第一个匹配项。
  3. 获取之间的子串。
  4. 检查它是否为等于'null'的字符串 - 然后返回null,否则返回字符串本身。

所以可以像在这个片段中完成的:

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')