JSON_VALUE 用于无名 JSON 有效负载

时间:2021-04-22 18:40:53

标签: json sql-server tsql

刚开始在 SQL Server 中使用 JSON_VALUE。我能够从 JSON 的名称/值对中提取值,但我碰巧有一个看起来像这样的对象:

["first.last@domain.com"]

当我尝试适用于名称/值对的方法时:

SELECT TOP 1
    jsonemail,
    JSON_VALUE(jsonemail, '$') as pleaseWorky
FROM MyTable

我取回了完整的输入,而不是 first.last@domain.com。我倒霉了吗?我不控制数据的上游来源。我认为它是一个被转换为 json 有效负载的 sting 集合。如果是 name:first.last@domain.com,我可以通过 $.name 获得它。

提前致谢。

2 个答案:

答案 0 :(得分:2)

它是一个 JSON 数组。所以你只需要指定它的索引,即 0。

请尝试以下解决方案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, jsonemail NVARCHAR(MAX));
INSERT INTO @tbl (jsonemail) VALUES
('["first.last@domain.com"]');
-- DDL and sample data population, end

SELECT ID
   , jsonemail AS [Before]
   , JSON_VALUE(jsonemail, '$[0]') as [After]
FROM @tbl;

输出

+----+---------------------------+-----------------------+
| ID |          Before           |         After         |
+----+---------------------------+-----------------------+
|  1 | ["first.last@domain.com"] | first.last@domain.com |
+----+---------------------------+-----------------------+

答案 1 :(得分:0)

From the docs

<块引用>
  • 数组元素。例如,$.product[3]。数组从零开始。

所以当根是一个数组并且你想要第一个值时你需要 JSON_VALUE(..., '$[0]')


要将其分成几行,您需要OPENJSON

SELECT TOP 1
   jsonemail
   ,j.[value] as pleaseWorky
FROM MyTable
CROSS APPLY OPENJSON(jsonemail) j