我的表名为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上发布一些迄今为止尝试过的不同方法
答案 0 :(得分:1)
嗯,在这样的非规范化数据中,您唯一的选择是解析它并尝试收发电子邮件。最优雅的方式 - 是使用json解析器,但它在当前版本的sql server中是不可用的,所以你必须手动解析它。
假设每封电子邮件记录均以{"Name":"Email","Value":
开头,您只需几步即可完成此操作:
{"Name":"Email","Value":
的位置。}
的第一次出现。所以可以像在这个片段中那样完成:
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')