【问题标题】:MSSQL JSON Select column as object keyMSSQL JSON 选择列作为对象键
【发布时间】:2020-10-13 08:00:01
【问题描述】:

我正在尝试直接从我的 MSSQL DB 中选择 JSON 结构。

我想要的是选择 ID 字段作为对象的 Key。

假设我有以下列:

ID | Firstname | LastName   | DateOfBirth | Gender
1  | Paul      | Van Tonder | 1990-03-11  | Male

我想选择成 JSON 格式如:

[
  {
    "1": {
        "FirstName": "Paul",
        "LastName": "Van Tonder",
        "DateOfBirth": "1990-03-11",
        "Gender": "Male"
    }

  }
]

【问题讨论】:

标签: json sql-server object key


【解决方案1】:

我不认为,您可以仅使用 FOR JSON 生成带有可变键名的 JSON 输出。所以,你需要使用基于字符串的方法:

  • 仅使用字符串连接/聚合
  • 结合使用FOR JSON 和字符串聚合

表:

CREATE TABLE Data (
   ID int, 
   FirstName varchar(50), 
   LastName varchar(50), 
   DateOfBirth date, 
   Gender varchar(50)   
)
INSERT INTO Data (ID, FirstName, LastName, DateOfBirth, Gender)
VALUES 
  (1, 'Paul',  'Van Tonder', '1990-03-11', 'Male'),
  (2, 'John',  'Van Tonder', '1990-03-12', 'Male')

语句(使用字符串聚合和连接):

SELECT CONCAT(
    '[',
    STRING_AGG(
        CONVERT(nvarchar(max), CONCAT(
            '{"FirstName":"', 
            FirstName, 
            '", "LastName":"', 
            LastName, 
            '", "DateOfBirth":"', 
            CONVERT(varchar, DateOfBirth), 
            '", "Gender": "', 
            Gender, 
            '"}')
        ),
        ','
    ),
    ']'
)
FROM Data

语句(使用FOR JSON 和字符串聚合):

SELECT CONCAT(
   '[',
   STRING_AGG(CONCAT('{"', d.ID, '": ',  c.Json), ','),
   ']'
   )
FROM Data d
CROSS APPLY (
   SELECT FirstName, LastName, DateOfBirth, Gender 
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) c (Json)

结果:

[
   {"1":{"FirstName":"Paul","LastName":"Van Tonder","DateOfBirth":"1990-03-11","Gender":"Male"}},
   {"2":{"FirstName":"John","LastName":"Van Tonder","DateOfBirth":"1990-03-12","Gender":"Male"}}
]

【讨论】:

  • 我尝试了这个,而不是简单的 CONCAT + STUFF 混合。哪个似乎更快,但还有其他更快的方法吗?
  • @crazyvonzipper 您对执行时间的看法是正确的。使用FOR JSON 的方法运行速度稍慢(用 1000000 行测试),但输出是 JSON,所以使用原生 JSON 支持是我的第一选择。谢谢。
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 2015-08-27
  • 2021-12-19
  • 2013-12-17
  • 1970-01-01
  • 2018-02-15
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多