很多時候,我們需要在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注:如果要執行我的這段sql只需要將sql中的`b`.`comment`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
替換成我上面舉例的四個字串中的任意乙個即可
文字描述:
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 ...