sql - SQL server OPENJSON,显示 JSON 原始字符串和字段的最佳方法
问题描述
我正在尝试使用OPENJSON()
TSQL 从 JSON 文件中选择结果:
ask_price, bid_price, mark_price ,high_price ,low_price ,open_price ,KEY ,value
我能够获取这些值,但它包含重复项。它应该只返回 3 行,但如您所见,它是 9 行。
我尝试使用 distinct 和 group by 但仍然有重复,它可能会影响性能。有没有我可以使用的替代方案?
DECLARE @JSONData AS NVARCHAR(4000)
SET @JSONData = N'{ "results":[ { "ask_price":"377.360000", "open_price":"376.475000","symbol":"BCHUSD","id":"24566"},
{ "ask_price":"9668.090000","open_price":"9642.645000","symbol":"BTCUSD","id":"32555"},
{"ask_price":"262.660000", "open_price":"260.890000","symbol":"ETHUSD","id":"356789"} ] }'
SELECT Y.*, Z.[KEY],Z.[value] FROM OPENJSON(@JSONData) AS x CROSS APPLY OPENJSON(x.value) WITH ( ask_price numeric(18,12), open_price numeric(18,12) ) AS Y CROSS APPLY OPENJSON(@JSONData, '$.results') as Z
结果
Current results
ask_price open_price KEY value
377.360000000000 376.475000000000 0 { "ask_price":"377.360000", "open_price":"376.475000","symbol":"BCHUSD","id":"24566"}
377.360000000000 376.475000000000 1 { "ask_price":"9668.090000","open_price":"9642.645000","symbol":"BTCUSD","id":"32555"}
377.360000000000 376.475000000000 2 {"ask_price":"262.660000", "open_price":"260.890000","symbol":"ETHUSD","id":"356789"}
9668.090000000000 9642.645000000000 0 { "ask_price":"377.360000", "open_price":"376.475000","symbol":"BCHUSD","id":"24566"}
9668.090000000000 9642.645000000000 1 { "ask_price":"9668.090000","open_price":"9642.645000","symbol":"BTCUSD","id":"32555"}
9668.090000000000 9642.645000000000 2 {"ask_price":"262.660000", "open_price":"260.890000","symbol":"ETHUSD","id":"356789"}
262.660000000000 260.890000000000 0 { "ask_price":"377.360000", "open_price":"376.475000","symbol":"BCHUSD","id":"24566"}
262.660000000000 260.890000000000 1 { "ask_price":"9668.090000","open_price":"9642.645000","symbol":"BTCUSD","id":"32555"}
262.660000000000 260.890000000000 2 {"ask_price":"262.660000", "open_price":"260.890000","symbol":"ETHUSD","id":"356789"}
Expected results
ask_price open_price KEY value
377.360000000000 376.475000000000 0 { "ask_price":"377.360000", "open_price":"376.475000","symbol":"BCHUSD","id":"24566"}
9668.090000000000 9642.645000000000 1 { "ask_price":"9668.090000","open_price":"9642.645000","symbol":"BTCUSD","id":"32555"}
262.660000000000 260.890000000000 2 {"ask_price":"262.660000", "open_price":"260.890000","symbol":"ETHUSD","id":"356789"}
解决方案
以下查询可以解决问题:
SELECT resdata.*, res.[KEY], res.[Value] FROM OPENJSON(@JSONData) AS resTab
CROSS APPLY OPENJSON(resTab.value) AS res
CROSS APPLY OPENJSON(res.value)
WITH ( ask_price numeric(18,12), bid_price numeric(18,12), mark_price numeric(18,12),
high_price numeric(18,12), low_price numeric(18,12), open_price numeric(18,12) ) AS resdata
推荐阅读
- spring-mvc - 将 Spring MVC 与 Wildfly 安全域和 Java 安全集成
- java - 如何让 this.name 在值对象构造函数的类定义中工作?
- javascript - 如何在地图函数中合并 React TableCells?
- acumatica - 如何使自定义字段显示超过 2 个小数位
- kubernetes - 使用 LoadBalancer 服务在 Kubernetes 中公开 Kafka 集群
- c# - 无法在某些 PC 上运行 WPF 桌面应用程序
- sql-server - sql查询获取客户地址
- java - Java 运行时环境没有足够的内存继续运行。当我运行我的 javac
- python - 如何加快简单的 OCR 任务?
- excel - 如何根据VBA中的邮件合并属性重命名word文档?