1

我有一个有一些列的表。其中一列以 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');
4

1 回答 1

0

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

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
于 2021-05-10T04:45:23.813 回答