Gru*_*uez 5 sql t-sql sql-server json
我有一个表,其中包含带有组 ID 的 json 字符串。我想创建一个 json 数组,其中包含具有相同 id 的所有 json 对象。
请注意,在我的例子中,我尝试放入数组中的列内容本身就是 json 片段,因此我的案例和问题比将行转换为数组更具体。OPENJSON在接受的答案中使用也利用了这个细节。
但是,我找不到使用 FOR JSON 的方法,该方法允许我选择单个列,而该列的名称不会成为数组中所有对象的键。
我意识到我想要摆脱的键是将列投影到 json 的键值表示的键所必需的,但在这种情况下,我只选择一列,我很好奇是否有一个我不能的技巧考虑到。
我可以通过简单地使用 COALASCE 来实现我想要的目标,但我想知道是否可以使用 FOR JSON 来处理这种边缘情况。这是演示我正在尝试做的事情的简化代码:
BEGIN
declare @Json_Snippets table (id int, json nvarchar(max));
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}');
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}');
select
JSON_QUERY(js.json) as 'dont_want_this'
from
@Json_Snippets js
FOR JSON PATH;
END
Run Code Online (Sandbox Code Playgroud)
我必须使用 JSON_QUERY 来避免 json 列中的转义字符,即 json 字符串保持为 json。运行上面给出:
[{"dont_want_this":{"root":{"obj":"one"}}},{"dont_want_this":{"root":{"obj":"two"}}}]
Run Code Online (Sandbox Code Playgroud)
我想得到的是:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,下一个方法可能会有所帮助。只需使用and子句选择json数据,然后使用以下格式设置结果:OPENJSON()WITHFOR JSON
-- Table
declare @Json_Snippets table (id int, json nvarchar(max));
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}');
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}');
-- Statement
SELECT j.[root]
FROM @Json_Snippets t
CROSS APPLY OPENJSON(t.json, '$') WITH ([root] nvarchar(max) AS JSON) j
FOR JSON AUTO
Run Code Online (Sandbox Code Playgroud)
输出:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]
Run Code Online (Sandbox Code Playgroud)