日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:338日期: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
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆成人在线观看| 国产亚洲一卡2卡3卡4卡新区| 久久国际精品| 国产欧美午夜| 麻豆一区二区三| 精品久久久久久久| 高潮久久久久久久久久久久久久| 精品久久美女| 久久久久久久久丰满| 久久久久久久久久久9不雅视频| 91精品一区二区三区综合| 欧美二区视频| 日韩精品一级中文字幕精品视频免费观看| 激情欧美国产欧美| 蜜臀久久99精品久久久久久9| 亚洲激情中文在线| 五月天久久网站| 亚洲免费专区| 国产精品久久久久久久久久妞妞| 成人在线视频中文字幕| 一区二区小说| 亚洲一区二区三区中文字幕在线观看| 国产欧美丝祙| 黄色不卡一区| 国产日本精品| 国产在线日韩| 国产精品扒开腿做爽爽爽软件| 黑森林国产精品av| 亚洲丝袜啪啪| 日韩天堂在线| 免费精品视频| 色在线视频观看| 日本99精品| 久久理论电影| 麻豆精品视频在线观看视频| 国产在线成人| 四虎国产精品免费观看| 亚洲专区视频| 国产韩日影视精品| 精品三级久久久| 日韩一区二区三区在线看| 在线手机中文字幕| 国产精品大片| 日本综合视频| 美女精品一区| se01亚洲视频 | 日韩专区视频网站| 欧美美女一区| 欧美黄色网页| 韩日一区二区| 国产精东传媒成人av电影| 亚洲欧美专区| 在线亚洲国产精品网站| 国产在线|日韩| 97精品国产| www.51av欧美视频| 欧美国产专区| 欧美激情aⅴ一区二区三区 | 日韩欧美国产精品综合嫩v| 国产乱人伦丫前精品视频| 色综合视频一区二区三区日韩| 婷婷亚洲五月| 99国产精品| 亚洲视频电影在线| 综合激情网...| 日韩精品一区二区三区中文| 午夜电影一区| 日本aⅴ亚洲精品中文乱码| 亚洲欧美网站在线观看| 亚洲视频国产精品| 亚洲女人av| 日韩高清电影一区| 麻豆91精品视频| 青青青免费在线视频| 久久久亚洲一区| 国产偷自视频区视频一区二区| 亚洲综合三区| 国产精品色婷婷在线观看| 国产成人免费视频网站视频社区| 欧美亚洲tv| 日韩亚洲一区在线| 美女日韩在线中文字幕| 欧美亚洲人成在线| 亚洲精品.com| 亚洲精品美女| 欧美日韩午夜电影网| 日韩理论片av| 亚洲另类黄色| 国产精品99久久精品| 亚洲中字黄色| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产午夜久久av| 亚洲91精品| 国产一区调教| 青草久久视频| 久久影院一区| 狠狠干成人综合网| 综合干狼人综合首页| 久久午夜影院| 免费看的黄色欧美网站| 麻豆久久一区| 自拍日韩欧美| 精品久久91| 日韩精品免费视频人成| 亚洲成人一区在线观看| 欧美视频精品全部免费观看| 美女少妇全过程你懂的久久| 国产精品探花在线观看| 视频在线在亚洲| 日本免费一区二区三区四区| 91精品电影| 人在线成免费视频| 国产精品亲子伦av一区二区三区| 伊人久久亚洲美女图片| 精品视频在线你懂得| 日本aⅴ免费视频一区二区三区| 美女网站一区| 99成人超碰| 日韩在线视频精品| 国产videos久久| 国产精品99久久免费观看| 亚洲精品综合| 在线日韩成人| 视频一区二区国产| 亚洲免费在线| 婷婷国产精品| 欧美午夜精彩| 亚洲成人精品| 久久久久久美女精品| 日韩国产专区| 伊伊综合在线| 欧美一区二区三区激情视频| 日韩中文首页| 免费视频一区三区| 怡红院精品视频在线观看极品| 欧美特黄一级| 日韩中文字幕1| 一本一道久久a久久| 久久国际精品| 久久精品亚洲一区二区| 免费在线欧美黄色| 伊人久久av| 免费视频久久| 欧美日韩一视频区二区| 麻豆久久一区| 欧美日韩中文字幕一区二区三区| 国产精品视区| 国产调教精品| 亚洲www免费| 美日韩精品视频| 欧美日韩一区自拍| 神马午夜在线视频| 久久福利一区| 欧美激情视频一区二区三区免费| 国产在线一区不卡| 国产 日韩 欧美一区| 日本欧美在线看| 国产精品www.| 香蕉精品视频在线观看| 国产精品一区三区在线观看| 精品入口麻豆88视频| 日韩午夜电影| 麻豆久久久久久| 人人爽香蕉精品| 在线人成日本视频| 青青草精品视频| 国产一区日韩一区| 麻豆久久一区| 亚洲一级大片| 久久精品卡一| 日韩va亚洲va欧美va久久| 成人美女视频| 欧美在线看片| 亚洲欧美日韩国产一区| 国产一区二区三区精品在线观看| 免费观看日韩电影| 久久精品动漫| 精品中文字幕一区二区三区 | 日韩av在线播放网址| 日本一区二区三区视频在线看| 欧美一区久久久| 狂野欧美性猛交xxxx| 亚洲精品精选| 久久福利影视| 四虎4545www国产精品| 久久精品天堂| 久久av偷拍| 91精品啪在线观看国产爱臀| 免费看精品久久片| 亚洲欧美不卡| 日韩视频二区| 中文欧美日韩| 好看不卡的中文字幕| 日韩三区在线| 天堂√中文最新版在线| 97精品国产| 视频福利一区| 亚洲国内欧美| 99亚洲视频| 午夜国产精品视频免费体验区|