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

您的位置:首頁技術(shù)文章
文章詳情頁

SQLServer高效解析JSON格式數(shù)據(jù)的實例過程

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

1. 背景

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

樣例數(shù)據(jù)如下

‘[{“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子串做截取,獲取兩列數(shù)據(jù)值。

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

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

/*
 * 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. 取值-創(chuàng)建函數(shù)截取key-value串的值

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

 /*
  *******************************************************************************
  *     Date : 2020-07-01
  *   Author : 飛虹
  *     Note : 利用patindex正則匹配字符,在while中對字符進行逐個匹配、替換為空。
  * Function : getDateAmt
  *   Input  : key-value字符串,如 "2020-01-01":"98.99"
  *   Output : Table類型(日期列,數(shù)值列)。值為 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
			 -- 匹配:去除非數(shù)字 、頓號、橫線 的字符
 			 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 
	-- 注意這里生成行號時, 需要設(shè)置默認遞歸次數(shù)
	option(maxrecursion 0)

5. 問題

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

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

標簽: MsSQL
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲自拍另类| 久久最新视频| 欧美日本久久| 久久精品xxxxx| 精品一区二区三区中文字幕在线| 欧美国产日韩电影| 国产精品xxx| 成人亚洲一区二区| 99精品在线| 亚洲综合不卡| 日本视频一区二区| 精品视频国内| 中文另类视频| 久久精品国产999大香线蕉| 国内一区二区三区| 不卡中文一二三区| 日韩欧美中文字幕一区二区三区 | 国产亚洲综合精品| 日韩中文字幕亚洲一区二区va在线| 亚洲综合中文| 国产精品视频首页| 中文在线а√天堂| 亚洲综合二区| 国产精品羞羞答答在线观看| 91精品韩国| 欧美三区四区| 国产二区精品| 国产情侣久久| 国产精品99视频| aa亚洲婷婷| 国产女人18毛片水真多18精品| 日韩免费高清| 免费人成在线不卡| 精品美女在线视频| 国产亚洲精品久久久久婷婷瑜伽| 日韩精品久久理论片| 国产一区二区三区久久| 亚洲免费播放| 久久永久免费| 石原莉奈一区二区三区在线观看| 亚洲啊v在线免费视频| yellow在线观看网址| 蜜臀精品一区二区三区在线观看| 国产精品久久久久久模特| 亚洲成人精品| 国产精品网址| 视频一区中文字幕| 伊人久久国产| 久久激情综合网| 欧美高清不卡| 免费一区二区三区在线视频| 丝瓜av网站精品一区二区| 精品一区二区三区在线观看视频| 99国产精品自拍| 麻豆精品视频在线观看视频| 久久高清免费观看| 黄色网一区二区| 亚洲18在线| 亚洲一区二区网站| 日韩一区电影| 国产精品第一| 亚洲精品欧洲| 在线国产一区二区| 色爱av综合网| 国产精品国码视频| 亚洲97av| 亚洲欧美日本日韩| 久久精品影视| 福利一区和二区| 欧美伊人久久| 亚洲精品日韩久久| 日本综合字幕| 国产粉嫩在线观看| 精品国产亚洲一区二区三区| 日韩成人精品一区二区三区 | 久久亚洲国产| 国产精品蜜芽在线观看| 国产精品亚洲一区二区在线观看| 日本大胆欧美人术艺术动态| 九色精品91| 99久久久久| 电影亚洲精品噜噜在线观看| 精品国产精品国产偷麻豆| 欧美日韩中文| 免费av一区二区三区四区| 中文在线中文资源| 国产一区二区三区91| 国产精品99精品一区二区三区∴| 亚洲精品九九| 国产一区二区精品| 午夜免费一区| 伊人久久大香线蕉av超碰演员| 99久久久久国产精品| 久久久成人网| 五月天激情综合网| 麻豆久久精品| 视频精品一区| 国产日韩视频在线| 老鸭窝一区二区久久精品| 国产精品一国产精品k频道56| 欧美天堂一区| 精品三级国产| 国产高清不卡| 国内精品福利| 蜜桃久久精品一区二区| 日本成人在线不卡视频| 国产福利亚洲| 成人片免费看| 在线 亚洲欧美在线综合一区| 天使萌一区二区三区免费观看| 亚洲精选91| 麻豆精品视频在线观看| 日韩精品电影| 黄色日韩在线| 日韩在线观看中文字幕| 国产亚洲精品美女久久久久久久久久| 国产精品成人自拍| 日韩欧美网址| 亚洲影视一区二区三区| 青青青国产精品| 91亚洲国产成人久久精品| 亚洲精品97| 日本在线不卡视频一二三区| 国产精品成人国产| 欧美日韩视频免费观看| 国产精品毛片在线| 日本aⅴ亚洲精品中文乱码| 久久精品国产成人一区二区三区| 日韩成人三级| 蜜臀精品久久久久久蜜臀| 不卡av一区二区| 日本亚洲视频| 国产第一亚洲| 伊人成人网在线看| 久久国产人妖系列| 国产一区二区三区久久久久久久久| 成人欧美一区二区三区的电影| 欧美日韩国产传媒| 国产免费av一区二区三区| 日韩免费在线| 日本成人一区二区| 久久婷婷久久| 国产亚洲一区二区三区不卡| 在线看片福利| 在线精品观看| 亚洲乱码视频| 国产精品一区二区精品视频观看| 日韩精品a在线观看91| 精品国产a一区二区三区v免费| 女人av一区| 国产免费av国片精品草莓男男| 欧美片第1页| 亚洲ww精品| 99久久久国产精品美女| 欧美欧美黄在线二区| 亚洲视频综合| 国产精品一区二区精品视频观看 | 欧美日韩视频网站| 日韩影院免费视频| 美腿丝袜亚洲一区| 西西人体一区二区| 国产一区二区三区日韩精品| 石原莉奈在线亚洲三区| 在线看片福利| 国产日产高清欧美一区二区三区| 久久婷婷丁香| 一区二区三区国产盗摄| 成人午夜在线| 欧美日韩一区二区三区四区在线观看 | 日韩午夜免费| 日韩中文首页| 久久亚洲道色| 国产美女精品视频免费播放软件| 免费精品视频| 不卡中文字幕| 欧美日韩色图| 国产一区二区视频在线看| 日韩福利视频网| 亚洲一区日韩在线| 欧美日韩在线播放视频| 国语对白精品一区二区| 欧美一级网址| 日韩不卡一区二区三区| 日韩中文字幕不卡| 欧美肉体xxxx裸体137大胆| 久久av超碰| 日本在线一区二区三区| 亚洲欧美日韩一区在线观看| 日韩毛片视频| 精品欧美视频| 麻豆精品视频在线观看视频| 亚洲激情二区| 激情久久婷婷| 伊人精品一区| 国产在线看片免费视频在线观看| 久久不见久久见中文字幕免费| 欧美日韩一区二区国产| 亚洲ww精品| 欧美日韩1区2区3区| 国产欧美高清视频在线|