gpt4 book ai didi

sql - 我可以在没有源列名成为 SQL Server 2016 键的情况下使用 FOR JSON 吗?

转载 作者:行者123 更新时间:2023-12-02 08:02:23 24 4
gpt4 key购买 nike

我有一个表,其中包含带有组 ID 的 json 字符串。我想创建一个包含所有具有相同 id 的 json 对象的 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

我必须使用 JSON_QUERY 以避免在 json 列中转义字符,即 json 字符串保持为 json。运行上面给出:
[{"dont_want_this":{"root":{"obj":"one"}}},{"dont_want_this":{"root":{"obj":"two"}}}]

我想得到的是:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]

最佳答案

如果我理解正确,下一种方法可能会有所帮助。只需选择您的 json数据与 OPENJSON()WITH子句,然后用 FOR 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

输出:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]

关于sql - 我可以在没有源列名成为 SQL Server 2016 键的情况下使用 FOR JSON 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55742902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com