将具有 JSON 字段的选择结果转换为 JSON,并将该数据与 JSON_VALUE() 一起使用

Posted

技术标签:

【中文标题】将具有 JSON 字段的选择结果转换为 JSON,并将该数据与 JSON_VALUE() 一起使用【英文标题】:Convert select result that has JSON field to JSON and use that data with JSON_VALUE() 【发布时间】:2021-05-10 04:28:22 【问题描述】:

我有一个包含一些列的表。 其中一列以 JSON 格式存储数据。 我使用FOR JSON AUTO 从该表中选择一行。 我的问题是 SQL Server 在 JSON 属性的值周围加上引号,但我不希望这样;因为我想将内部 JSON 的值与JSON_VALUE() 一起使用。我能做什么?

代码:

SELECT TOP 1 *
FROM users;

结果:

name    lastName    age    favorites
John    Duo         20     "city": "paris", "color": "blue", "sport": "football"

代码:

SELECT TOP 1 *
FROM users
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;

结果:

"name":"John","lastName":"Duo","age":20,"favorites":"\"city\": \"paris\", \"color\": \"blue\", \"sport\": \"football\""

代码:

SELECT JSON_VALUE(@user_json,'$.favorites.color')

结果:

NULL

我可以使用这个技巧从内部 JSON 中获取值,但它并不干净。

代码:

SELECT JSON_VALUE(JSON_VALUE(@user_json,'$.favorites'), '$.color')

结果:

blue

我怎样才能以干净的方式做到这一点?

一些用于在 SQL Server 中测试的代码:

DROP TABLE IF EXISTS #test_tbl;
DECLARE @user_json AS NVARCHAR(MAX);
  
SELECT 'John' AS Name, 'Duo' AS LastName, 20 AS Age, '"city": "paris", "color": "blue", "sport": "football"' AS favorites
INTO #test_tbl;

SET @user_json =
(
    SELECT *
    FROM #test_tbl
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
)

SELECT JSON_VALUE(@user_json,'$.favorites.color');

SELECT JSON_VALUE(JSON_VALUE(@user_json,'$.favorites'),'$.color');

【问题讨论】:

【参考方案1】:

您需要使用json_query() 嵌套收藏夹 JSON,例如:

SET @user_json =
(
    SELECT Name, LastName, Age, json_query(favorites) as favorites
    FROM #test_tbl
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
)

SELECT JSON_VALUE(@user_json,'$.favorites.color');

# (No column name)
# ----------------
# blue

【讨论】:

我的列正在更改中,我想使用 * 号将所有列都包含在我的 JSON 中。 你不能这样做@MohammadHoseinMasoon。 SQL 查询需要在运行之前定义好,而不是在运行时定义。 需要在数据集中定义您想要的列;没有神奇的“SELECT 任何没有定义结构的列 FROM ...`语法。

以上是关于将具有 JSON 字段的选择结果转换为 JSON,并将该数据与 JSON_VALUE() 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?

如何将具有重复字段值的表格数据转换为层次结构的 JSON?

将mysql结果转换为具有正确类型的json

将 MySQL 结果转换为 JSON 的效率

如何使用 Python 将 bigquery 返回的结果转换为 Json 格式?

有没有办法让 PHP 将 sql 结果直接转换为 JSON?