我有一个 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)
这将记录返回为行而不是列,但同样,只有第一个元素。
可以说,我如何向下遍历以检索第二个、第三个等等元素?
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
归档时间: |
|
查看次数: |
27379 次 |
最近记录: |