如何使用SQL Server将json转换为平面文件(表格)格式?

问题描述 投票:0回答:1

我正在使用 TD Ameritrade 的期权链输出,并希望访问各种值,例如出价、要价等,以及来自标头的代码和价格。

我的问题似乎是日期和行使价是关键,而不是固定的。

JSON格式如下:

我无法发布我的问题,json 文本看起来像代码......不知道如何发布

我想要的输出应该是这样的:

symbol   underlyingprice    putCall   expdate       strike    bid   ask
-------------------------------------------------------------------------
AMZN     90.965             PUT       2023-03-17:6  90.0      1.83  1.88
AMZN     90.965             PUT       2023-03-17:6  91.0      2.27  2.36
  .
json sql-server chain
1个回答
0
投票

为简洁起见,以下代码中的 JSON 是先前 Stack Overflow 问题中出现的 JSON 的简化示例,解析股票市场数据的嵌套 JSON 数据,它似乎也使用了从 Ameritrade 返回的数据获取开放链方法:

declare @json nvarchar(max) = N'{
    "symbol": "AAPL",
    "underlyingPrice": 132.325,
    "putExpDateMap": {
        "2021-01-08:8": {
            "132.0": [
                {
                    "putCall": "PUT",
                    "bid": 2.4,
                    "ask": 2.43,
                    "strikePrice": 132.0
                }
            ],
            "133.0": [
                {
                    "putCall": "PUT",
                    "bid": 2.93,
                    "ask": 2.95,
                    "strikePrice": 133.0
                }
            ]
        }
    }
}';

with putExpDateMapKeys (putExpDate, jsonPath) as (
  select
    [key],
    N'$.putExpDateMap.' + quotename([key], N'"') -- e.g.: '$.putExpDateMap."2021-01-08:8"'
  from openjson(@json, N'$.putExpDateMap')
), strikePriceKeys (putExpDate, jsonPath) as (
  select
    putExpDate,
    N'$.' + quotename(putExpDate, N'"') + N'.' + quotename([key], N'"') -- e.g.: '$."2021-01-08:8"."132.0"'
  from putExpDateMapKeys
  cross apply openjson(@json, jsonPath)
)
select J.symbol, J.underlyingPrice, S.putCall, putExpDate as expdate, S.strikePrice, S.bid, S.ask
from openjson(@json) with (
  symbol nvarchar(4),
  underlyingPrice float,
  putExpDateMap nvarchar(max) as JSON
) J
cross apply strikePriceKeys SPK
outer apply openjson(putExpDateMap, SPK.jsonPath) with (
  putCall nvarchar(4),
  strikePrice float,
  bid float,
  ask float
) S;

产生输出:

符号 底层价格 putCall 展开 罢工价格 出价
苹果 132.325 2021-01-08:8 132 2.4 2.43
苹果 132.325 2021-01-08:8 133 2.93 2.95

那么这个查询是如何工作的呢?

putExpDateMap
中的属性键是动态的,因此我们不能使用硬编码的 JSON 路径来访问它们的内容。我使用两个 CTE 表达式来枚举键:

  1. putExpDateMapKeys
    枚举日期键,例如:
    "2021-01-08:8"
  2. 在每个日期键中(因为我假设可能有多个)
    strikePriceKeys
    枚举行使价键,例如:
    "132.0"
    "133.0"

每个 CTE 表达式还返回一个 JSON 路径,然后允许最终调用

openjson()
以访问
putCall
bid
ask
strikePrice
值。

© www.soinside.com 2019 - 2024. All rights reserved.