mysql解析json字串相關問題

2022-02-25 14:01:11 字數 3937 閱讀 5907

很多時候,我們需要在sql裡面直接解析json字串。這裡針對mysql5.7版本的分水嶺進行區分。

1.對於mysql5.7以上版本

使用mysql的內建函式json_extract(column, '$.key'),這個函式有兩個引數,第乙個引數column代表json列的列名;第二個引數key代表json字串中的某乙個key。

select json_extract('', '$.pricediscount') as '定價折扣';

對於簡單的json字串肯定是可以解析成功,但是對於巢狀陣列的沒試過。

2.對於mysql5.7以下版本

只能充分發揮已有函式的功能去擷取實現,無論實現方式是儲存過程還是簡單的sql語句,其原理都是一樣的。

第一步,將所有的花括號的閉括號'}'替換成英文逗號',';第二步,獲取key的座標keyindex和長度keylength;第三步,獲取以key為起點,第乙個英文逗號','的座標symbolindex;第四步,使用substring擷取字串substring(targetjsonstr, keyindex + keylength, symbolindex - keyindex - keylength);第五步,使用replace將雙引號'"'替換成空字串'',完工。

示例:從中獲取pricediscount的值。

select

replace(

-- substring(s,n,len)

-- 帶有 len 引數的格式,從字串 s 返回乙個長度同 len 字元相同的子字串,起始於位置 n。

substring(

replace(

'' ,

'}' ,

',') , -- s 將初始欄位中的有括號替換成','號

-- locate(substr,str)

-- 返回字串substr在字串str中第一次出現的位置從1開始計數 。

locate(

'pricediscount":' ,

replace(

'' ,

'}' ,

',')

) + char_length('pricediscount":') ,-- n 起始位置

locate(

',' ,

replace(

'' ,

'}' ,

',') ,

locate(

'pricediscount":' ,

replace(

'' ,

'}' ,

',')

) + char_length('pricediscount":') -- n後的第乙個','號在 s 中所在的位置

) -(

locate(

'pricediscount":' ,

replace(

'' ,

'}' ,

',')

) + char_length('pricediscount":')

) -- 計算出了key值對應的value值的長度

) ,'"' ,

'') as '定價折扣';

文字描述:

1.先將原始字串的右'}' 替換成 ','   

2.計算出key值在步驟1中的位置,當做字段擷取的起始位置

3.計算出key值右邊最近的乙個','號在步驟1中的位置  - 步驟2的位置 = key值對應的value值即字段擷取長度

4.擷取value值兩邊的雙引號,即得出value值

參考:相關函式介紹

locate函式

語法 一:

locate(substr,str)

返回字串substr在字串str中第一次出現的位置從1開始計數 。

如:

select locate("a","abca")
查詢結果:

語法二:

locate(substr,str,pos)

返回字串substr從pos往後數在字串str中第一次出現的位置從1開始計數 。

如:

select locate("a","abca",2)
查詢結果:

注:如果str、substr中任意乙個欄位為null則查詢結果為null

如果substr在str中不存在則返回0

substring函式

mysql中獲取子串函式 substring(s,n,len) 帶有 len 引數的格式,從字串 s 返回乙個長度同 len 字元相同的子字串,起始於位置 n。

也可能對 n 使用乙個負值。假若這樣,則子字串的位置起始於字串結尾的第 n 個字元,即倒數第 n 個字元,而不是字串的開頭位置。

參考:char_length函式

返回函式內字串的長度

如:

char_length('pricediscount":')
查詢結果: 

踩坑背景:公司使用了mongodb資料庫存放資料,但是我所做的通用統計服務資料又存放在mysql內,所以需要mongodb的資料往mysql匯入,如果是簡單的資料倒是沒啥,但是這個json資料就有點難搞了。

比如上面的例子:他的key值是固定的,順序可能也一致。mongodb裡面的資料就不一樣了

舉幾個例子:

順序不一致,key值不一定全

select  

replace(

substr(

replace(ifnull(`b`.`comment`, ''),'}', ','), -- 原始字段

locate('scotoma":', replace(ifnull(`b`.`comment`, ''), '}', ','))+ char_length('scotoma":'), -- 起始位置

if(locate('scotoma":',

replace(ifnull(`b`.`comment`, ''),

'}',

',')

) <> 0, -- 判定key值是否存在

locate(',',

replace(ifnull(`b`.`comment`, ''), '}', ','),

locate('scotoma":', replace(ifnull(`b`.`comment`, ''), '}', ','))

+ char_length('scotoma":')

) - (locate('scotoma":', replace(ifnull(`b`.`comment`, ''), '}', ',')) + char_length('scotoma":')) -- 有就正常取值獲取取值長度

, 0) -- 沒有就取長度0

), -- 獲取value內容

'"',

'' )

from ctr_new_db.cti_quality_judgement b

注:如果要執行我的這段sql只需要將sql中的`b`.`comment`

替換成我上面舉例的四個字串中的任意乙個即可

文字描述:

1.先將原始字串的右'}' 替換成 ','   

2.計算出key值在步驟1中的位置,當做字段擷取的起始位置

3.判定key值在這個json中是否存在,存在則按照之前的計算邏輯獲取value值的大小,不存在則取0

4.擷取value值兩邊的雙引號,即得出value值

mysql解析json字串

1.對於mysql5.7以上版本 使用mysql的內建函式json extract column,key 這個函式有兩個引數,第乙個引數column代表json列的列名 第二個引數key代表json字串中的某乙個key。select json extract pricediscount as 定價折...

Mysql解析json字串 陣列

1 mysql解析json字串 解決方法 json extract 原欄位,json欄位名 執行sql select json extract t.result,row json extract t.result,value json extract t.result,criteria from t...

JSON字串解析

一 json物件 js可以按以下方式定義物件 varobj 這樣就定義了物件 obj,它有兩個公共屬性id和name,可以用 obj.id 的方式直接訪問其屬性值。從伺服器獲取資料時往往不止乙個物件,這就需要用到物件陣列,js中物件陣列可以用 來定義,如下 varobjs alert objs 0 ...