我有一个 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)
这将记录返回为行而不是列,但同样,只有第一个元素。
可以说,我如何向下遍历以检索第二个、第三个等等元素?
我目前能够使用SQL Server的"OPENJSON WITH(..."语法解析大部分JSON文件.但是,这个特定的文件包含我不知道如何处理的嵌套数组.
我读过的许多例子都将JSON引用为变量.在这种情况下,我正在调用一个文件:
select DEV_JSON.*
from OPENROWSET
(BULK 'C:\Users\Myuser\Documents\JSON_extract.json', SINGLE_CLOB) as my_datafile
CROSS APPLY OPENJSON(BulkColumn)
WITH
(DOC_ID varchar(100) '$.doc._id',
DOC_REV varchar(45) '$.doc._rev',
DELY_APPL_NAME varchar(20) '$.doc.delivery.application',
DELY_SENT_BY varchar(25) '$.doc.delivery.sender.id',
DELY_SENT_TYPO varchar(20) '$.doc.delivery.sender.type',
.....
....
...
..) as DEV_JSON
Run Code Online (Sandbox Code Playgroud)
其中一个属性包含嵌套数组.下面我复制了我的JSON的前5个属性,以及嵌套的"recipients"数组.
如何构建我的SQL来解析这一部分?
"doc": {
"_id": "049d4e4030afcdeefedaa90f640f91d4a2be93d7-bd_abcxyz@somemail.com",
"_rev": "3-e119db13dae8d50ae0c4579ba9c87fc9",
"delivery": {
"application": "App_XYZ",
"sender": {
"id": "MABarrera@yahoo.com",
"type": "user"
},
"recipients": [{
"type": "email",
"recipient": "\"Artzer, Daniel J\" <DJArtzer@emailaddr.com>",
"sentTS": "2017-10-18T13:04:00.133Z"
},
{
"type": "email",
"recipient": "\"Higgins, Laura L\" <LLHiggins@emailaddr.com>",
"sentTS": "2017-10-18T13:04:00.133Z"
}, …Run Code Online (Sandbox Code Playgroud) 我创建了一个包含 25 列的 SQL Server 表。我的一列实际上是 JSON 文本,存储为 nvarchar(max)。
现在我需要能够查询这个 JSON 列并解析出各种属性。我曾尝试将 JSON_VALUE 应用于我的专栏,但我做错了;我的查询运行但为所有值返回 NULL。
JSON 本身看起来像:
[
{
"lineName":"GHjr",
"pipeDiameter":"12",
"pipeLength":"52000",
"pressure":"15",
"volume":"107"
},
{
"lineName":"Ks3R",
"pipeDiameter":"9",
"pipeLength":"40000",
"pressure":"15",
"volume":"80"
}
]
Run Code Online (Sandbox Code Playgroud)
我使用的 SQL 是:
select
DOC_ID, LINE_SPECS,
JSON_VALUE(LINE_SPECS, '$.lineName') as line_name,
JSON_VALUE(LINE_SPECS, '$.pipe_Diameter') as diameter
from dbo.MY_TEST_DOCS
where ISJSON(LINE_SPECS) > 0
and len(LINE_SPECS) > 3
Run Code Online (Sandbox Code Playgroud)
但是,我的 2 个“已解析”列返回所有 NULL。如何解析此列中的五个属性?
我跑了
select dbtimezone, sessiontimezone
from dual
Run Code Online (Sandbox Code Playgroud)
分别返回 -04:00 和 -06:00。
我也跑了
select
TZ_OFFSET('US/Eastern') "EST_offset",
TZ_OFFSET('America/Denver') "Mtn Time offset"
from dual
Run Code Online (Sandbox Code Playgroud)
返回相同的数字。
我的问题是,如何将“-04:00”转换为“美国/东部”之类的内容?是否有我忽略的简单内置函数,或者我是否需要编写自己的 CASE 语句来创建这种关系?
谢谢!
我是noSQL,couchDB和mapreduce的新手,需要一些帮助。
我在这里讨论了相同的问题{ 如何在Fauxton中使用reduce },但不理解答案:(。
我有一个工作图功能:
function (foo) {
if(foo.type == "blog post");
emit(foo)
}
Run Code Online (Sandbox Code Playgroud)
它返回11个单独的文档。我想修改它以返回foo.type以及1。我尝试过:
function (doc) {
if(doc.type == "blog post");
return count(doc)
}
Run Code Online (Sandbox Code Playgroud)
和“减少”面板中的“ _count”,但由于View不返回任何内容,因此显然做错了什么。
在此先感谢您的协助或指导!