从字符串中提取电子邮件地址
问题描述:
我有一个名为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
这是我将使用更新我的系统中的字符串。
我以前已经实现了从相同的数据中选择电话号码,但它是一个固定的长度。我似乎无法取消电子邮件地址。
我会后一对夫妇不同的方法我都试过到目前为止一次,我回来了,在我的电脑
答
那么,在这样的非规范化的数据您唯一的选择就是分析它,并尝试获取电子邮件。最优雅的方式 - 是使用json解析器,但在当前版本的sql server中并不令人满意,所以你必须手动解析它。
假设每个记录的电子邮件{"Name":"Email","Value":
开始,你可以做到这一点在以下几个步骤:
- 的
{"Name":"Email","Value":
查找位置在您的字符串。 - 在字符串的右边余下找到
}
的第一个匹配项。 - 获取之间的子串。
- 检查它是否为等于'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')
嗨,你尝试过什么自己写? 'SELECT [???????????] FROM [Entities] WHERE [Id] = @ entityId'实际上并不是一种尝试。 –
这是Json数据吗? – JsonStatham
为什么你不在一列中存储分隔值的另一个例子。 –