在 SQL Server 中解析 JSON 列

Car*_*Ben 13 sql-server json

我有一个 JSON 字符串存储在 SQL Server 表列中。该列名为 MSSG_RECIPS,包含一个长文本字符串,例如:

`{"type":"email","recipient":"\"Artzer, Daniel J\" <DJArtzer@emailaddr.com>","sentTS":"2017-11-08T20:58:14.600Z"},{"type":"email","recipient":"\"Friedman, Brian\" <BFriedman@emailaddr.com>","sentTS":"2017-11-08T20:58:14.600Z"},{"type":"email","recipient":"\"Higgins, Laura L\" <LLHiggins@emailaddr.com>","sentTS":"2017-11-08T20:58:14.600Z"},{"type":"email","recipient":"\"Landenberger, Dan R\" <DRLandenberger@emailaddr.com>","sentTS":"2017-11-08T20:58:14.600Z"},{"type":"email","recipient":"\"Leitl, Scott\" <SLeitl@emailaddr.com>","sentTS":"2017-11-08T20:58:14.600Z"},{"type":"email","recipient":"\"Mendoza, Mario\" <MMendoza@emailaddr.com>","sentTS":"2017-11-08T20:58:14.600Z"}`
Run Code Online (Sandbox Code Playgroud)

此示例字符串说明了我的 JSON 的格式,每个元素均以逗号分隔。

我可以用两种方式解析。一,使用 JSON_VALUE,我可以将属性作为单独的列进行检索:

select
 JSON_VALUE(mssg_recips, '$.type'),
 JSON_VALUE(mssg_recips, '$.recipient'),
 JSON_VALUE(mssg_recips, '$.sentTS'),
 DOC_ID
from MY_JSON_TAB
Run Code Online (Sandbox Code Playgroud)

但是,这仅返回 JSON 的第一个元素。

我尝试的另一种方法是:

select doc_id, value as EMAIL_RECIP
from MY_JSON_TAB
Cross Apply OPENJSON(MSSG_RECIPS)
Run Code Online (Sandbox Code Playgroud)

这将记录返回为行而不是列,但同样,只有第一个元素。

可以说,我如何向下遍历以检索第二个、第三个等等元素?

Use*_*ady 7

JSON_VALUE返回单个标量值。对于嵌套 JSON 对象的数组,您可以使用JSON_QUERY

使用时CROSS APPLY OPENJSON() WITH( ...)需要指定要提取的 JSON 数组的属性,例如

select id, recipient, sentTS
from my_json_tab
CROSS APPLY OPENJSON(my_json) WITH(
       recipient varchar(200)
     , sentTS varchar(60)
     ) as my_json_array

+----+-------------------------------------------+--------------------------+
| id |                 recipient                 |          sentTS          |
+----+-------------------------------------------+--------------------------+
|  1 | "AAAA, Daniel J" <DJArtzer@emailaddr.com> | 2017-11-08T20:58:14.600Z |
|  1 | "BBBB, Brian" <BFriedman@emailaddr.com>   | 2017-11-08T20:58:14.600Z |
|  1 | "CCCC, Laura L" <LLHiggins@emailaddr.com> | 2017-11-08T20:58:14.600Z |
|  2 | "xxxx, Daniel J" <DJArtzer@emailaddr.com> | 2017-11-08T20:58:14.600Z |
+----+-------------------------------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

注意:存储多元素 JSON 时,您需要将整个 JSON 包含在 [ ] 内

在示例结果中,ID=1 有 [ json-here ],但 id=2 没有,请注意结果的差异。返回 ID=1 的所有元素,但对于 id=2 则不然。

请参阅此dbfiddle以获取上述示例的现场演示。

OPENJSON 是一个表值函数,它解析 JSON 文本并以行和列的形式从 JSON 输入返回对象和属性。换句话说,OPENJSON 提供了 JSON 文档的行集视图。您可以显式指定行集中的列以及用于填充列的 JSON 属性路径。由于 OPENJSON 返回一组行,因此您可以在 Transact-SQL 语句的 FROM 子句中使用 OPENJSON,就像使用任何其他表、视图或表值函数一样。 https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql