導航:首頁 > 編程語言 > mysql如何解析json字元串

mysql如何解析json字元串

發布時間:2023-04-16 22:21:55

❶ 求救,mysql怎麼解析json

DELIMITER $$ USE `dw`$$ DROP FUNCTION IF EXISTS `fn_Json_getKeyValue`$$ CREATE DEFINER=`data`@`%` FUNCTION `fn_Json_getKeyValue`( in_JsonArray VARCHAR(4096),#JSON數組字元串 in_Index TINYINT, #JSON對象序號,序號從1開始 in_KeyName VARCHAR(64)#鍵名 ) RETURNS VARCHAR(512) CHARSET utf8 BEGIN DECLARE vs_return VARCHAR(4096); DECLARE vs_JsonArray, vs_Json, vs_KeyName VARCHAR(4096); #declare vs_Json varchar(4096); DECLARE vi_pos1, vi_pos2 SMALLINT UNSIGNED; #寫監控日誌 #insert into dw.t_etl_log(sp_name, title, description) #values('dw.fn_Json_getKeyValue', '通過Json鍵名取鍵值', concat('in_JsonArray=', in_JsonArray)); SET vs_JsonArray = TRIM(in_JsonArray); SET vs_KeyName = TRIM(in_KeyName); IF vs_JsonArray = '' OR vs_JsonArray IS NULL OR vs_KeyName = '' OR vs_KeyName IS NULL OR in_Index 0 THEN #如果鍵名存在 SET vi_pos1 = vi_pos1 + CHAR_LENGTH(vs_KeyName); SET vi_pos2 = LOCATE(',', vs_json, vi_pos1); IF vi_pos2 = 0 THEN #最後一個元素沒有','分隔符,也沒有結束符'}' SET vi_pos2 = CHAR_LENGTH(vs_json) + 1; END IF; SET vs_return = REPLACE(MID(vs_json, vi_pos1, vi_pos2 - vi_pos1), '"', ''); END IF; END IF; END IF; RETURN(vs_return); END$$ DELIMITER ; 測試: {"old_current_score":"2","new_current_score":"0","old_grade_id":"1","new_grade_id":"1","grade_time":"2016-04-09 00:43:26","grade_upgrade_time":"2017-04-09 00:43:26"} select fn_Json_getKeyValue(reason,1,'old_grade_id')

❷ mysql(5.6及以下)解析json

example:裂穗
select json_extract_c(json, "瞎源渣$.totalDays"磨悄), json from item limit 100;

❸ mysql5.7以下怎麼解析json

DELIMITER $$

USE `dw`$$

DROP FUNCTION IF EXISTS `fn_Json_getKeyValue`$$

CREATE DEFINER=`data`@`%` FUNCTION `fn_Json_getKeyValue`(
in_JsonArray VARCHAR(4096),#JSON數組字元串
in_Index TINYINT, #JSON對象序號,序號從1開始
in_KeyName VARCHAR(64)#鍵名
) RETURNS VARCHAR(512) CHARSET utf8
BEGIN
DECLARE vs_return VARCHAR(4096);
DECLARE vs_JsonArray, vs_Json, vs_KeyName VARCHAR(4096);
#declare vs_Json varchar(4096);
DECLARE vi_pos1, vi_pos2 SMALLINT UNSIGNED;

#寫監控日誌
#insert into dw.t_etl_log(sp_name, title, description)
#values('dw.fn_Json_getKeyValue', '通過Json鍵名取鍵值', concat('in_JsonArray=', in_JsonArray));

SET vs_JsonArray = TRIM(in_JsonArray);
SET vs_KeyName = TRIM(in_KeyName);

IF vs_JsonArray = '' OR vs_JsonArray IS NULL
OR vs_KeyName = '' OR vs_KeyName IS NULL
OR in_Index <= 0 OR in_Index IS NULL THEN
SET vs_return = NULL;
ELSE
#去掉方括弧
SET vs_JsonArray = REPLACE(REPLACE(vs_JsonArray, '[', ''), ']', '');
#取指定的JSON對象
SET vs_json = SUBSTRING_INDEX(SUBSTRING_INDEX(vs_JsonArray,'}', in_index),'}',-1);

IF vs_json = '' OR vs_json IS NULL THEN
SET vs_return = NULL;
ELSE
SET vs_KeyName = CONCAT('"', vs_KeyName, '":');
SET vi_pos1 = INSTR(vs_json, vs_KeyName);
IF vi_pos1 > 0 THEN
#如果鍵名存在
SET vi_pos1 = vi_pos1 + CHAR_LENGTH(vs_KeyName);
SET vi_pos2 = LOCATE(',', vs_json, vi_pos1);
IF vi_pos2 = 0 THEN
#最後一個元素沒有','分隔符,也沒有結束符'}'
SET vi_pos2 = CHAR_LENGTH(vs_json) + 1;
END IF;
SET vs_return = REPLACE(MID(vs_json, vi_pos1, vi_pos2 - vi_pos1), '"', '');
END IF;
END IF;
END IF;

RETURN(vs_return);
END$$

DELIMITER ;

測試: {"old_current_score":"2","new_current_score":"0","old_grade_id":"1","new_grade_id":"1","grade_time":"2016-04-09 00:43:26","grade_upgrade_time":"2017-04-09 00:43:26"}
select fn_Json_getKeyValue(reason,1,'old_grade_id');

❹ mysql資料庫中某個欄位存的是json數據,如何對json數據中的數據進行操作

這個可以吧json格式的字元串解析成數組json_decode()函數,變成數組以後就可以方便操作了,可以刪除數組中專的屬任意一項,也可以增加一項比如:array_push($data,['sort'=>3,'catentryId'=>10003]),再變成json格式的存入資料庫。方法有多種,這里簡單的示例下

❺ mysql中的json數據類型

JSON數組包含一個由逗號分隔的值列表,並包含在 字元[和]字元中:

JSON對象包含一組由逗號分隔的鍵值對,並包含在字元{和 }字元中,JSON對象中的鍵必須是字元串:

在JSON數組元素和JSON對象鍵值中允許嵌套:

在MySQL中,JSON值被寫為字元串。MySQL解析在需要JSON值的上下文中使用的任何字元串,如果它作為JSON無效則會產生錯誤。

1.JSON_ARRAY 生成json數組
JSON_ARRAY(val1,val2,val3...)生成一個包含指定元素的json數組。

2.JSON_OBJECT 生成json對象
JSON_OBJECT(key1,val1,key2,val2...) 生成一個包含指定K-V對的json object。如果有key為NULL或參數個數為奇數,則拋錯。

3.JSON_QUOTE 加"號
JSON_QUOTE(json_val) -- 將json_val用"號括起來。

2.插入記錄
創建一個表

插入含有json數組的記錄

插入含有json對象的記錄

路徑表達式對於提取JSON文檔的一部分或修改JSON文檔的函數很有用,以指定該文檔中的操作位置。例如,以下查詢從JSON文檔中提取具有 name 鍵的成員的值 :

路徑語法使用前導 $ 字元來表示正在考慮的JSON文檔,可選地後跟選擇器,它們連續指示文檔的更多特定部分:

如果路徑表達式中的未加引號的鍵名稱不合法,則必須引用命名鍵的路徑組件。讓我們 $ 參考這個值,且密鑰都包含空格,必須引用:

可以使用帶有 to 關鍵字的范圍來指定JSON數組的子集。

last關鍵字被支撐為最後一個元素的陣列中的索引的同義詞。表單的表達式可用於相對定址,也可用於范圍定義,如下所示: last - * N *

4.JSON_REMOVE()獲取JSON文檔和一個或多個指定要從文檔中刪除的值的路徑。返回值是原始文檔減去文檔中存在的路徑選擇的值

JSON值可以使用進行比較 =、<、<=、>、>=、<>、!=、<=>
JSON值尚不支持以下比較運算符和函數:BETWEEN、IN()、GREATEST()、LEAST()
以上列出的比較運算符和函數是通過將JSON值轉換為本機MySQL數值或字元串數​​據類型,使它們具有一致的非JSON標量類型。
JSON值的比較發生在兩個級別。第一級比較基於比較值的JSON類型。如果類型不同,則比較結果僅由哪種類型具有更高優先順序來確定。如果這兩個值具有相同的JSON類型,則使用特定於類型的規則進行第二級比較。

NULL->INTEGER, DOUBLE->STRING->OBJECT->ARRAY->BOOLEAN->DATE->TIME->DATETIME->OPAQUE->BIT->BLOB按此順序優先順序依次變大。

對於具有相同優先順序的JSON值,比較規則是特定於類型的:
1) BLOB、BIT、OPAQUE
比較兩個值 的第一個位元組,其中N是較短值中的位元組數。如果N兩個值的第一個位元組相同,則在較長值之前排序較短的值。
2) DATETIME
表示較早時間點的值在表示稍後時間點的值之前排序。如果兩個值最初 分別來自MySQL DATETIME 和 TIMESTAMP 類型,則它們相等,如果它們代表相同的時間點。
3)TIME
兩個時間值中較小的一個在較大的值之前排序。
4) DATE`
較早的日期是在最近的日期之前訂購的。
5) ARRAY
如果兩個JSON數組具有相同的長度並且數組中相應位置的值相等,則它們是相等的。如果數組不相等,則它們的順序由第一個位置中存在差異的元素確定。首先排序在該位置具有較小值的數組。如果較短數組的所有值都等於較長數組中的相應值,則首先排序較短的數組。

8) STRING
字元串在被比較的兩個字元串以詞法字典序排序 ,其中 N 是較短字元串的長度。如果 N 兩個字元串的第一個 位元組相同,則認為較短的字元串小於較長的字元串。

❻ mysql如何截取一個json字元串

代碼如下:
CREATE PROCEDURE sp_str
(
IN p_str VARCHAR(50), /*原始字元串*/
IN p_begin_str VARCHAR(50), /*要匹配的起始字元串*/
IN p_end_str VARCHAR(50)) /*要匹配的結束字元串*/
OUT p_result VARCHAR(50)) /*返回結果*/
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE m_len INT DEFAULT 0;
DECLARE m_index INT DEFAULT 0;
/*計算第一個匹配字元串的索引位置*/
select locate(p_begin_str,p_str)+char_length(p_begin_str) into m_index;
/*計算第一個匹配字元串的長度*/
select locate(p_end_str,p_str,m_index) into m_len;
select SUBSTRING(p_str,m_index,m_len-m_index) INTO p_result ;
END;

執行:
CALL sp_str('[]abcd[12345]aa[]ss','abcd[',']',@result);
返回值 @result 為12345
call sp_str('[]abcd[sdww]aa[]ss','abcd[',']',@result);
返回值 @result 為sdww
如果不用存儲過程,可以直接寫sql語句實現:

代碼如下:
select SUBSTRING(
']abcd[12345]111[]',
locate('abcd[',']abcd[12345]111[]')+CHAR_LENGTH('abcd['),
locate(']',']abcd[12345]111[]',CHAR_LENGTH('abcd['))-
(select locate('abcd[',']abcd[12345]111[]')+CHAR_LENGTH('abcd['))
)

返回值為 12345
關於mysql的函數介紹:
CHAR_LENGTH(str)
返回字元串str的長度。
LOCATE(substr,str)
POSITION(substr IN str)
返回子串substr在字元串str第一個出現的位置,如果substr不是在str裡面,返回0.
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0
該函數是多位元組可靠的。 LOCATE(substr,str,pos)
返回子串substr在字元串str第一個出現的位置,從位置pos開始。如果substr不是在str裡面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7
這函數是多位元組可靠的。
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
從字元串str返回一個len個字元的子串,從位置pos開始。使用FROM的變種形式是ANSI SQL92語法。
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'
該函數是多位元組可靠的。
SUBSTRING(str,pos)

閱讀全文

與mysql如何解析json字元串相關的資料

熱點內容
motoxt800刷機教程 瀏覽:591
有了中標文件單價該如何審計結算 瀏覽:57
港版蘋果616G多少錢最新報價 瀏覽:6
揭陽學編程哪個好 瀏覽:315
蘋果護眼壁紙 瀏覽:699
pcsx2按鍵配置文件 瀏覽:740
快賺鎖屏密碼忘了怎麼辦 瀏覽:849
後綴是acd是什麼文件 瀏覽:593
電腦無法打開視頻文件怎麼辦 瀏覽:904
如何簡化applewatch上的app 瀏覽:646
王者榮耀紫色字體代碼 瀏覽:186
surfacepro4系統版本 瀏覽:655
一加手機升級文件在哪個文件夾 瀏覽:537
u盤裝不了4g文件 瀏覽:740
豆神美育app怎麼退款 瀏覽:530
微信吃葯表情動態 瀏覽:425
網路廣播怎麼保存錄音 瀏覽:777
照片變漫畫ps教程 瀏覽:46
現在找不到王者cg文件 瀏覽:590
pdf文件怎麼編輯圖片要會員 瀏覽:303

友情鏈接