【问题标题】:Format only part of the query results as JSON in SQL Server在 SQL Server 中仅将部分查询结果格式化为 JSON
【发布时间】:2017-10-10 22:05:46
【问题描述】:

我有一个 SQL 表 X,它有一个 JSON 列“JsonVal”和一些其他列

Name      Id    Group    JsonVal
----------------------------------------------------------
Name1      2     gg1     {"LogLevel":"2", "InfoLevel":"3"}
Name2      3     gg5     {"LogLevel":"4"}

按照我想要的方式解析并理解 JsonVal 列中的数据后, 我想从表 X 中读取,以便得到如下结果:

Name      Id    Features
----------------------------------------------------------
Name1      2     {"HasLogLevel":"True", "LogLevel":"2", "HasInfoLevel":"True"}
Name2      3     {"HasLogLevel":"True", "LogLevel":"4", "HasInfoLevel":"False"}

我无法找到将部分列转换为 JSON 的方法。 如果我在这样的查询中使用 FOR JSON:

SELECT Name,Id,
HasLogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NOT NULL THEN 'True' ELSE 'False' END,
LogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NULL THEN 'NO-VALUE'  ELSE JSON_VALUE(JsonVal,'$."LogLevel"') END,
HasInfoLevel = CASE WHEN JSON_VALUE(JsonVal,'$."InfoLevel"') IS NOT NULL THEN 'True' ELSE 'False' END
FROM X FOR JSON PATH

它将所有列(包括名称、ID)转换为 JSON。但我只希望在结果中将 3 列 HasLogLevel、LogLevel 和 HasInfoLevel 格式化为 JSON

有没有办法在 SQL Server 中以我想要的方式在单个查询中查询和获取结果?

【问题讨论】:

  • 你的方案是什么?也许您可以使用 Python 查询 Azure SQL 数据库并从那里生成新的 JSON 字符串。
  • @EstienneGranet 由于限制,我只能使用 T-SQL。您知道通过查询实现此目的的方法吗?

标签: sql sql-server json sql-server-2012 azure-sql-database


【解决方案1】:

FOR JSON PATH 适用于整个查询结果,因此您不能在单个 SELECT 语句中组合 JSON 类数据和非 JSON 类数据。使用子查询专门创建 JSON,然后使用别名将其与其他列匹配。

此方法需要Id 列上的UNIQUE/PRIMARY KEY 约束,以便WHERE 子句一次只返回一个结果。

SELECT  T1.[Name], T1.[Id], 
    ( SELECT HasLogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NOT NULL THEN 'True' ELSE 'False' END,
    LogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NULL THEN 'NO-VALUE'  ELSE JSON_VALUE(JsonVal,'$."LogLevel"') END,
    HasInfoLevel = CASE WHEN JSON_VALUE(JsonVal,'$."InfoLevel"') IS NOT NULL THEN 'True' ELSE 'False' END
    FROM TestTable AS T2 
    WHERE T2.[Id] = T1.[Id]
    FOR JSON PATH) AS Features
FROM TestTable AS T1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多