电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SQLServer高效解析JSON格式數據的實例過程

瀏覽:172日期:2023-03-06 14:25:40

1. 背景

最近碰到個需求,源數據存在posgtreSQL中,且為JSON格式。那如果在SQLServer中則 無法直接使用,需要先解析成表格行列結構化存儲,再復用。

樣例數據如下

‘[{“key”:“2019-01-01”,“value”:“4500.0”},{“key”:“2019-01-02”,“value”:“4500.0”},{“key”:“2019-01-03”,“value”:“4500.0”},{“key”:“2019-01-04”,“value”:“4500.0”},{“key”:“2019-01-05”,“value”:“4500.0”},{“key”:“2019-01-06”,“value”:“4500.0”},{“key”:“2019-01-07”,“value”:“4500.0”},{“key”:“2019-01-08”,“value”:“4500.0”},{“key”:“2019-01-09”,“value”:“4500.0”},{“key”:“2019-01-10”,“value”:“4500.0”},{“key”:“2019-01-11”,“value”:“4500.0”},{“key”:“2019-01-12”,“value”:“4500.0”},{“key”:“2019-01-13”,“value”:“4500.0”},{“key”:“2019-01-14”,“value”:“4500.0”},{“key”:“2019-01-15”,“value”:“4500.0”},{“key”:“2019-01-16”,“value”:“4500.0”},{“key”:“2019-01-17”,“value”:“4500.0”},{“key”:“2019-01-18”,“value”:“4500.0”},{“key”:“2019-01-19”,“value”:“4500.0”},{“key”:“2019-01-20”,“value”:“4500.0”},{“key”:“2019-01-21”,“value”:“4500.0”},{“key”:“2019-01-22”,“value”:“4500.0”},{“key”:“2019-01-23”,“value”:“4500.0”},{“key”:“2019-01-24”,“value”:“4500.0”},{“key”:“2019-01-25”,“value”:“4500.0”},{“key”:“2019-01-26”,“value”:“4500.0”},{“key”:“2019-01-27”,“value”:“4500.0”},{“key”:“2019-01-28”,“value”:“4500.0”},{“key”:“2019-01-29”,“value”:“4500.0”},{“key”:“2019-01-30”,“value”:“4500.0”},{“key”:“2019-01-31”,“value”:“4500.0”}]’

研究了下方法,可以先將 JSON串 拆成獨立的 key-value對,再來對key-value子串做截取,獲取兩列數據值。

2. 拆串-拆分JSON串至key-value子串

這里主要利用行號和分隔符來組合完成拆分的功能。
參考如下樣例。
主要利用連續數值作為索引(起始值為1),從源字符串每個位置截取長度為1(分隔符的長度)的字符,如果為分隔符,則為有效的、待處理的記錄。有點類似于生物DNA檢測中的鳥槍法,先廣撒網,再根據標記識別、追蹤。

/*
 * Date   : 2020-07-01
 * Author : 飛虹
 * Sample : 拆分 指定分割符的字符串為單列多值
 * Input  : 字符串"jun,cong,haha"
 * Output : 列,值為 "jun", "cong", "haha"
 */
declare @s nvarchar(500) = "jun,cong,haha"
			,@sep nvarchar(5) = ",";
with cte_Num as (
	select 1 as n
	union all
	select n+1 n from cte_Num where n<100
)
select d.s, a.n 
		  ,n-len(replace(left(s, n), @sep, "")) + 1 as pos,
		  CHARINDEX(@sep, s+@sep, n),
  substring(s, n, CHARINDEX(@sep, s+@sep, n)-n) as element
from (select @s as s) as d
 join cte_Num a 
 on
	 n<=len(s) and 
 substring(@sep+s, n, 1) = @sep

3. 取值-創建函數截取key-value串的值

基于第2步的結果,可以將JSON長串拆分為 key-value字符串,如 “2020-01-01”:“98.99”。到這一步,就好辦了。既可以自己寫表值函數來返回結果,也可以直接通過substring來截取。這里開發一個表值函數,來進行封裝。

 /*
  *******************************************************************************
  *     Date : 2020-07-01
  *   Author : 飛虹
  *     Note : 利用patindex正則匹配字符,在while中對字符進行逐個匹配、替換為空。
  * Function : getDateAmt
  *   Input  : key-value字符串,如 "2020-01-01":"98.99"
  *   Output : Table類型(日期列,數值列)。值為 2020-01-01, 98.99 
  *******************************************************************************
 */
 CREATE FUNCTION dbo.getDateAmt(@S VARCHAR(100))
 RETURNS   @tb_rs table(dt date, amt decimal(28,14)) 
 AS
 BEGIN
	 WHILE PATINDEX("%[^0-9,-.]%",@S) > 0
		 BEGIN
			 -- 匹配:去除非數字 、頓號、橫線 的字符
 			 set @s=stuff(@s,patindex("%[^0-9,-.]%",@s),1,"")
		 END
		 insert into @tb_rs 
			select SUBSTRING(@s,1,charindex(",",@s)-1)
				 , substring(@s,charindex(",",@s)+1, len(@s) )
		return
  END
 GO
 
 --測試
 select  * from DBO.getDateAmt("{"key":"2019-01-01","value":"4500.0"")
 

4. 完整樣例

附上完整腳本樣例,全程CTE,直接查詢,預覽效果。

;with cte_t1 as (
			select * from 
			( values("jun","[{"key":"2019-01-01","value":"4500.0"},{"key":"2019-01-02","value":"4500.0"},{"key":"2019-01-03","value":"4500.0"},{"key":"2019-01-04","value":"4500.0"},{"key":"2019-01-05","value":"4500.0"},{"key":"2019-01-06","value":"4500.0"},{"key":"2019-01-07","value":"4500.0"},{"key":"2019-01-08","value":"4500.0"},{"key":"2019-01-09","value":"4500.0"},{"key":"2019-01-10","value":"4500.0"},{"key":"2019-01-11","value":"4500.0"},{"key":"2019-01-12","value":"4500.0"},{"key":"2019-01-13","value":"4500.0"},{"key":"2019-01-14","value":"4500.0"},{"key":"2019-01-15","value":"4500.0"},{"key":"2019-01-16","value":"4500.0"},{"key":"2019-01-17","value":"4500.0"},{"key":"2019-01-18","value":"4500.0"},{"key":"2019-01-19","value":"4500.0"},{"key":"2019-01-20","value":"4500.0"},{"key":"2019-01-21","value":"4500.0"},{"key":"2019-01-22","value":"4500.0"},{"key":"2019-01-23","value":"4500.0"},{"key":"2019-01-24","value":"4500.0"},{"key":"2019-01-25","value":"4500.0"},{"key":"2019-01-26","value":"4500.0"},{"key":"2019-01-27","value":"4500.0"},{"key":"2019-01-28","value":"4500.0"},{"key":"2019-01-29","value":"4500.0"},{"key":"2019-01-30","value":"4500.0"},{"key":"2019-01-31","value":"4500.0"}]")
				   ,("congc","[{"key":"2019-01-01","value":"347.82608695652175"},{"key":"2019-01-02","value":"347.82608695652175"},{"key":"2019-01-03","value":"347.82608695652175"},{"key":"2019-01-04","value":"347.82608695652175"},{"key":"2019-01-07","value":"347.82608695652175"},{"key":"2019-01-08","value":"347.82608695652175"},{"key":"2019-01-09","value":"347.82608695652175"},{"key":"2019-01-10","value":"347.82608695652175"},{"key":"2019-01-11","value":"347.82608695652175"},{"key":"2019-01-14","value":"347.82608695652175"},{"key":"2019-01-15","value":"347.82608695652175"},{"key":"2019-01-16","value":"347.82608695652175"},{"key":"2019-01-17","value":"347.82608695652175"},{"key":"2019-01-18","value":"347.82608695652175"},{"key":"2019-01-21","value":"347.82608695652175"},{"key":"2019-01-22","value":"347.82608695652175"},{"key":"2019-01-23","value":"347.82608695652175"},{"key":"2019-01-24","value":"347.82608695652175"},{"key":"2019-01-25","value":"347.82608695652175"},{"key":"2019-01-28","value":"347.82608695652175"},{"key":"2019-01-29","value":"347.82608695652175"},{"key":"2019-01-30","value":"347.82608695652175"},{"key":"2019-01-31","value":"347.82608695652175"}]")
			) as t(name, jsonStr)
)   , cte_rn as (
				select 1 as rn 
				union all
				select rn+1 from cte_rn where rn < 1000
	)  
	, cte_splitJson as (
    			SELECT  a.name
 							  ,replace(replace(a.jsonStr,"[",""),"]","") as jsonStr
 	 						  ,substring(replace(replace(a.jsonStr,"[",""),"]","")
											, b1.rn
											, charindex("},", replace(replace(a.jsonStr,"[",""),"]","")+"},", b1.rn)-b1.rn ) as value_json
 	   			from cte_t1 a
 					cross join cte_rn b1 
 				where  substring("},"+replace(replace(a.jsonStr,"[",""),"]",""), rn, 2) = "},"
 	)
	select *  
  	from cte_splitJson a
		cross apply dbo.getDateAmt(a.value_json) as t1 
	-- 注意這里生成行號時, 需要設置默認遞歸次數
	option(maxrecursion 0)

5. 問題

經過在個人普通配置PC實測,性能有點堪憂,耗時:數據量 約為15mins:50W ,不太能接受。有興趣或者經歷過的伙伴,出手來協助, 怎么提高效率,或者來個新方案?

到此這篇關于SQLServer高效解析JSON格式數據的文章就介紹到這了,更多相關SQLServer解析JSON數據內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MsSQL
主站蜘蛛池模板: 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 柴油发电机组_柴油发电机_发电机组价格-江苏凯晨电力设备有限公司 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 传动滚筒_厂家-淄博海恒机械制造厂 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 山东信蓝建设有限公司官网 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 小型手持气象站-空气负氧离子监测站-多要素微气象传感器-山东天合环境科技有限公司 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | POS机官网 - 拉卡拉POS机免费办理|官网在线申请入口 | 999范文网_优质范文下载写作帮手| 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 |