环境:SQL Server 2014 及以上
如何使用 SELECT 语句访问 JSON 值中的电子邮件值?
select JSON_VALUE('[{"data":{"email":"test@email.com"}}]', '$.email') as test
环境:SQL Server 2014 及以上
如何使用 SELECT 语句访问 JSON 值中的电子邮件值?
select JSON_VALUE('[{"data":{"email":"test@email.com"}}]', '$.email') as test
Json 支持仅在 SQL Server 2016 中引入 - 因此对于任何以前的版本,您都需要使用字符串操作代码或简单地解析 SQL Server 之外的 json(可能使用 CLR 函数)
对于 2016 版本或更高版本,您可以JSON_VALUE
这样使用:
declare @json as varchar(100) = '[{"data":{"email":"test@email.com"}}]';
select JSON_VALUE(@json, '$[0].data.email') as test
对于较旧的版本 - 你也许可以摆脱这个,但如果你的 json 值不包含email
属性,你会得到意想不到的结果:
select substring(string, start, charindex('"', string, start+1) - start) as test
from (
select @json as string, charindex('"email":"', @json) + 9 as start
) s
你可以看到现场演示db<>fiddle
其他方式。PatternSplitCM非常适合这样的东西。
提取单个电子邮件值:
DECLARE @json as varchar(200) = '[{"data":{"email":"test@email.com"}}]';
SELECT f.Item
FROM dbo.patternsplitCM(@json,'[a-z0-9@.]') AS f
WHERE f.item LIKE '%[a-z]%@%.%[a-z]%'; -- Simple Email Check Pattern
提取所有电子邮件地址(如果/当有更多):
DECLARE @json VARCHAR(200) = '[{"data":{"email":"test@email.com"},{"email2":"test2@email.net"}},{"data":{"MoreEmail":"test3@email.555whatever"}}]';
SELECT f.Item
FROM dbo.patternsplitCM(@json,'[a-z0-9@.]') AS f
WHERE f.item LIKE '%[a-z]%@%.%[a-z]%'; -- Simple Email Check Pattern
回报:
Item
--------------------------
test@email.com
test2@email.net
test3@email.555whatever
或者...只获取出现的第一个电子邮件地址:
SELECT TOP (1) f.Item
FROM dbo.patternsplitCM(@json,'[a-z0-9@.]') AS f
WHERE f.item LIKE '%[a-z]%@%.%[a-z]%' -- Simple Email Check Pattern
ORDER BY ROW_NUMBER() OVER (ORDER BY f.ItemNumber)
令人讨厌的快速,超级简单。没有游标、循环或其他不好的东西。
使用 v2014 没有 JSON 支持,但是 - 如果您的真正 JSON 如此简单 - 有时使用一些替换来将 JSON 转换为 XML 就像这里一样是个好主意,这允许原生 XML 方法:
DECLARE @YourJSON NVARCHAR(MAX)=N'[{"data":{"email":"test@email.com"}}]';
SELECT CAST(REPLACE(REPLACE(REPLACE(REPLACE(@YourJSON,'[{"','<'),'":{"',' '),'":"','="'),'}}]',' />') AS XML).value('(/data/@email)[1]','nvarchar(max)');
可以通过两种方式完成:
首先,如果您的 JSON 数据介于[ ]
您的问题中:
select JSON_VALUE('[{"data":{"email":"test@email.com"}}]','$[0].data.email' ) as test
如果您的 JSON 数据不在[ ]
:
select JSON_VALUE('{"data":{"email":"test@email.com"}}','$.data.email' ) as test
你可以在这里测试上面的代码
您的查询应该是这样的(SQL Server 2016):
DECLARE @json_string NVARCHAR(MAX) = 'your_json_value'
SELECT [key],value
FROM OPENJSON(@json_string, '$.email'))
更新 :
select JSON_VALUE(@json_string, '$[0].data.email') as test