0

环境:SQL Server 2014 及以上

如何使用 SELECT 语句访问 JSON 值中的电子邮件值?

select JSON_VALUE('[{"data":{"email":"test@email.com"}}]', '$.email') as test
4

5 回答 5

4

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

于 2019-09-04T14:11:05.870 回答
4

其他方式。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)

令人讨厌的快速,超级简单。没有游标、循环或其他不好的东西。

于 2019-09-04T15:45:57.550 回答
3

使用 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)');
于 2019-09-04T14:51:56.977 回答
2

可以通过两种方式完成:
首先,如果您的 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

你可以在这里测试上面的代码

于 2019-09-04T14:10:06.273 回答
1

您的查询应该是这样的(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
于 2019-09-04T13:57:20.497 回答