欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年08月29日 09:52:15   作者:飛虹147  
Sql Server從2016開始支持了一些json操作,最近的項目里也是好多地方直接用字段直接存成了json,下面這篇文章主要給大家介紹了關(guān)于SQLServer高效解析JSON格式數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下

1. 背景

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

樣例數(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,直接查詢,預(yù)覽效果。

;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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 理解SQL SERVER中的邏輯讀,預(yù)讀和物理讀

    理解SQL SERVER中的邏輯讀,預(yù)讀和物理讀

    在我的上一篇關(guān)于SQL SERVER索引的博文,有圓友問道關(guān)于邏輯讀,預(yù)讀和物理讀的概念.我覺的還是寫一篇博文能把這個問題解釋清楚
    2011-12-12
  • SQLServer查詢歷史執(zhí)行記錄的方法實現(xiàn)

    SQLServer查詢歷史執(zhí)行記錄的方法實現(xiàn)

    有的時候,需要知道近段時間SQLSERVER執(zhí)行了什么語句,本文主要介紹了SQLServer查詢歷史執(zhí)行記錄的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • SqlServer參數(shù)化查詢之where in和like實現(xiàn)之xml和DataTable傳參介紹

    SqlServer參數(shù)化查詢之where in和like實現(xiàn)之xml和DataTable傳參介紹

    在上一篇Sql Server參數(shù)化查詢之where in和like實現(xiàn)詳解中介紹了在Sql Server使用參數(shù)化查詢where in的幾種實現(xiàn)方案,遺漏了xml和表值參數(shù),這里做一個補充
    2012-05-05
  • 存儲過程配合UpdateDaset方法批量插入Dataset數(shù)據(jù)實現(xiàn)代碼

    存儲過程配合UpdateDaset方法批量插入Dataset數(shù)據(jù)實現(xiàn)代碼

    用存儲過程配合UpdateDaset方法批量插入Dataset數(shù)據(jù),感興趣的你可不要錯過了哈,希望本文提供知識點可以幫助到你
    2013-02-02
  • sqlserver 數(shù)據(jù)庫學(xué)習(xí)筆記

    sqlserver 數(shù)據(jù)庫學(xué)習(xí)筆記

    sqlserver 數(shù)據(jù)庫學(xué)習(xí)筆記,學(xué)習(xí)sqlserver的朋友可以參考下。
    2011-11-11
  • 自增長鍵列統(tǒng)計信息的處理方法

    自增長鍵列統(tǒng)計信息的處理方法

    在這篇文章展示了SQL Server的查詢優(yōu)化器如何使用自增長鍵列統(tǒng)計信息,大家都知道SQLServer里每個統(tǒng)計信息對象都有關(guān)聯(lián)的直方圖直方圖用多個步長描述指定列數(shù)據(jù)分布情況,需要的朋友可以參考下
    2015-07-07
  • 必須會的SQL語句(三) 數(shù)據(jù)插入

    必須會的SQL語句(三) 數(shù)據(jù)插入

    這篇文章主要介紹了sqlserver中數(shù)據(jù)插入的sql語句,需要的朋友可以參考下
    2015-01-01
  • 異步的SQL數(shù)據(jù)庫封裝詳解

    異步的SQL數(shù)據(jù)庫封裝詳解

    一直在尋找一種簡單有效的庫,它能在簡化數(shù)據(jù)庫相關(guān)的編程的同時提供一種異步的方法來預(yù)防死鎖。使用這個庫,你可以輕松地連接到任何SQL-Server數(shù)據(jù)庫,執(zhí)行任何存儲過程或 T-SQL 查詢,并異步地接收查詢結(jié)果。這個庫采用C#開發(fā),沒有其他外部依賴。
    2015-09-09
  • SqlServer 巧妙解決多條件組合查詢

    SqlServer 巧妙解決多條件組合查詢

    開發(fā)中經(jīng)常會遇得到需要多種條件組合查詢的情況,比如有三個表,年級表Grade(GradeId,GradeName),班級Class(ClassId,ClassName,GradeId),學(xué)員表Student(StuId,StuName,ClassId),現(xiàn)要求可以按年級Id、班級Id、學(xué)生名,這三個條件可以任意組合查詢學(xué)員信息
    2012-11-11
  • mysql如何優(yōu)化插入記錄速度

    mysql如何優(yōu)化插入記錄速度

    插入記錄時,影響插入速度的主要是索引、唯一性校驗、一次插入記錄條數(shù)等。根據(jù)這些情況,可以分別進行優(yōu)化,本節(jié)將介紹優(yōu)化插入記錄速度的幾種方法。下面跟著小編一起來看下吧
    2017-03-03

最新評論