詳解Mysql中的JSON系列操作函數

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

一、方法羅列:

分類 函數 描述
創建json
json_array 創建json數組
json_object 創建json對象
json_quote 將json轉成json字符串類型
查詢json
json_contains 判斷是否包含某個json值
json_contains_path 判斷某個路徑下是否包json值
json_extract 提取json值
column->path json_extract的簡潔寫法,MySQL 5.7.9開始支持
column->>path json_unquote(column -> path)的簡潔寫法
json_keys 提取json中的鍵值為json數組
json_search 按給定字符串關鍵字搜索json,返回匹配的路徑
修改json
json_append 廢棄,MySQL 5.7.9開始改名為json_array_append
json_array_append 末尾添加數組元素,如果原有值是數值或json對 象,則轉成數組后,再添加元素
json_array_insert 插入數組元素
json_insert 插入值(插入新值,但不替換已經存在的舊值)
json_merge 合并json數組或對象
json_remove 刪除json數據
json_replace 替換值(只替換已經存在的舊值)
json_set 設置值(替換舊值,并插入不存在的新值)
json_unquote 去除json字符串的引號,將值轉成string類型
返回json屬性
json_depth 返回json文檔的最大深度
json_length 返回json文檔的長度
json_type 返回json值得類型
json_valid 判斷是否為合法json文檔

?

?

?

二、使用例子:

?

?

MySQL?5.7.8開始支持 json類型.

?

create table t(id int,js json,PRIMARY KEY (`id`))

插入數據
insert into t values(1,'{"a":1,"s":"abc"}')
insert into t values(2,'[1,2,{"a":123}]')
insert into t values(3,'"str"')
insert into t values(4,'123')

直接提供字符串即可。還可以用JSON_Array和JSON_Object函數來構造
insert into t values(5,JSON_Object('key1',v1,'key2',v2))
insert into t values(4,JSON_Array(v1,v2,v3))

JSON_OBJECT([key, val[, key, val] ...])
JSON_ARRAY([val[, val] ...])

?


JSON_SET(json_doc, path, val[, path, val] ...)
修改數據

update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

結果js={"a":456,"s":"abc","b":"bbb"}

path中$就代表整個doc,然后可以用JavaScript的方式指定對象屬性或者數組下標等.
執行效果,類似json的語法
$.a=456
$.b="bbb"

存在就修改,不存在就設置.

$.c.c=123
這個在javascript中會出錯,因為.c為null。
但是在json_set('{}','$.c.c',123)中,不存在的路徑將直接被忽略。

特殊的對于數組,如果目標doc不是數組則會被轉換成[doc],然后再執行set,
如果set的下標超過數組長度,只會添加到數組結尾。

select json_set('{"a":456}','$[1]',123)
結果[{"a":456},123]。目標現被轉換成[{"a":456}],然后應用$[1]=123。

select json_set('"abc"','$[999]',123)
結果["abc",123]。

?

再舉幾個例子
select json_set('[1,2,3]','$[0]',456,'$[3]','bbb')
結果[456,2,3,'bbb']

注意:
對于javascript中
var a=[1,2,3]
a.a='abc'
是合法的,但是一旦a轉成json字符串,a.a就丟失了。

而在mysql中,這種算作路徑不存在,因此
select json_set('[1,2,3]','$.a',456)
結果還是[1,2,3]

?

然后還有另外兩個版本
JSON_INSERT(json_doc, path, val[, path, val] ...)
如果不存在對應屬性則插入,否則不做任何變動

JSON_REPLACE(json_doc, path, val[, path, val] ...)
如果存在則替換,否則不做任何變動

這兩個操作倒是沒有javascript直接對應的操作
select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
結果{"a":1,"s":"abc","b":"bbb"}

select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
結果{"a":456,"s":"abc"}

加上刪除節點
JSON_REMOVE(json_doc, path[, path] ...)
如果存在則刪除對應屬性,否則不做任何變動
select json_replace('{"a":1,"s":"abc"}','$.a','$.b')
結果{"s":"abc"}

涉及數組時,三個函數與json_set基本一樣
select json_insert('{"a":1}','$[0]',456)
結果不變,認為0元素已經存在了,注意這里結果不是[{"a":1}]

select json_insert('{"a":1}','$[999]',456)
結果追加到數組結尾[{"a":1},456]


select json_replace('{"a":1}','$[0]',456)
結果456!而非[456]

select json_replace('{"a":1}','$[1]',456)
結果不變。

其實對于json_insert和json_replace來說一般情況沒必要針對數組使用。

?


select json_remove('{"a":1}','$[0]')
結果不變!

select json_remove('[{"a":1}]','$[0]')
結果[]

總之涉及數組的時候要小心。


JSON_MERGE(json_doc, json_doc[, json_doc] ...)
將多個doc合并

select json_merge('[1,2,3]','[4,5]')
結果[1,2,3,4,5]。數組簡單擴展

select json_merge('{"a":1}','{"b":2}')
結果{"a":1,"b":2}。兩個對象直接融合。

特殊的還是在數組
select json_merge('123','45')
結果[123,45]。兩個常量變成數組

select json_merge('{"a":1}','[1,2]')
結果[{"a":1},1,2]。目標碰到數組,先轉換成[doc]

select json_merge('[1,2]','{"a":1}')
結果[1,2,{"a":1}]。非數組都追加到數組后面。

?

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
給指定的節點,添加元素,如果節點不是數組,則先轉換成[doc]

select json_Array_append('[1,2]','$','456')
結果[1,2,456]

select json_Array_append('[1,2]','$[0]','456')
結果[[1,456],2]。指定插在$[0]這個節點,這個節點非數組,所以等效為
select json_Array_append('[[1],2]','$[0]','456')


JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
在數組的指定下標處插入元素

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4)
結果[1,4,2,3]。在$數組的下標1處插入

SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4)
結果[1,[1,4,2,3],3]。在$[1]數組的下標1處插入

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5)
結果[4,5,1,2,3]。注意后續插入是在前面插入基礎上的,而非[4,1,5,2,3]

?

提取json信息的函數
JSON_KEYS(json_doc[, path])
返回指定path的key

select json_keys('{"a":1,"b":2}')
結果["a","b"]

select json_keys('{"a":1,"b":[1,2,3]}','$.b')
結果null。數組沒有key

?

JSON_CONTAINS(json_doc, val[, path])
是否包含子文檔

select json_contains('{"a":1,"b":4}','{"a":1}')
結果1

select json_contains('{"a":2,"b":1}','{"a":1}')
結果0

select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a')
結果1。數組包含則需要所有元素都存在。

select json_contains('{"a":[1,2,3],"b":1}','1','$.a')
結果1。元素存在數組元素中。


JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
檢查路徑是否存在

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c')
結果1。只要存在一個

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c')
結果0。必須全部存在。


select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d')
結果1。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d')
結果0。


JSON_EXTRACT(json_doc, path[, path] ...)
獲得doc中某個或多個節點的值。

select json_extract('{"a":1,"b":2}','$.a')
結果1

select json_extract('{"a":[1,2,3],"b":2}','$.a[1]')
結果2


select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.*')
結果[1,2,3]。a.*通配a所有屬性的值返回成數組。


select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b')
結果[2,4]。通配$中所有層次下的屬性b的值返回成數組。

mysql5.7.9開始增加了一種簡寫方式:column->path

select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b'
等價于
select id,json_extract(js,'$.id')?
from t where json_extract(js,'$.a')=1
order by json_extract(js,'$.b')

?

?

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
強大的查詢函數,用于在doc中返回符合條件的節點,select則是在表中返回符合要求的紀錄。

select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%')

結果$.a。和like一樣可以用%和_匹配,在所有節點的值中匹配,one只返回一個。

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%')
結果["$.a","$.b.c"]


select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b')
結果["$.b.c"]。限制查找范圍。

select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b')
結果["$.b.c","$.c.b"]。查找范圍還可使用通配符!在每個匹配節點和其下查找。


注意,只有json_extract和json_search中的path才支持通配,其他json_set,json_insert等都不支持。


JSON_LENGTH(json_doc[, path])
返回數組的長度,如果是object則是屬性個數,常量則為1

select json_length('[1,2,3]')
結果3

select json_length('123')
結果1

select json_length('{"a":1,"b":2}')
結果2

可再跟path參數
select json_length('{"a":1,"b":[1,2,3]}','$.b')
結果3


JSON_DEPTH(json_doc)
返回doc深度


select json_depth('{}'),json_depth('[]'),json_depth('123')
結果1,1,1

select json_depth('[1,2,3,4,5,6]')
結果2

select json_depth('{"a":{"b":{"c":1}}}')
結果4

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450545.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WEB/H5性能優化總結

我們今天來說說前端圖形渲染優化,因為我接下來的時間可能要開始研究webgl方面的東西,所以就在這里把之前做過的H5做一個總結,現同步發布于GERRY_BLOG,TiMiGerry-知乎,轉載請保留鏈接。靜態資源-圖片 一 、圖片格式JPEG…

C語言數組參數與指針參數

我們都知道參數分為形參和實參。形參是指聲明或定義函數時的參數,而實參是在調用函數時主調函數傳遞過來的實際值。 一、一維數組參數 1、能否向函數傳遞一個數組?看例子:void fun(char a[10]){char c a[3];}intmain(){char b[10] “abcd…

maven文件結構

pom.xml 用于maven的配置文件 /src 源代碼目錄 /src/main 工程源代碼目錄 /src/main/java 工程java源代碼目錄 /src/main/resource 工程的資源目錄 /src/test 單元測試目錄 /src/test/java /target 輸出目錄,所有的輸出都存放在這個目錄下 /target/classes 編譯之…

php如何使用高階函數

1、首先學會數組轉集合的方式 (1)使用collect函數 $arr [1, 2, 3, 4, 5]; $collect collect($arr); (2)使用array_map函數 $arr [1, 2, 3, 4, 5]; $collect array_map(function($item){ return $item *…

Git 使用,命令說明

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. D:\ChengXu\git\Git中雙擊Git Bash啟動git窗口。 2. 這條不能放到博客,是我的賬號密碼。 3. 添加: git add …

2017ACM/ICPC亞洲區沈陽站 C Hdu-6219 Empty Convex Polygons 計算幾何 最大空凸包

題面 題意:給你一堆點,求一個最大面積的空凸包,里面沒有點. 題解:紅書板子,照抄完事,因為題目給的都是整點,所以最后答案一定是.5或者.0結尾,不用對答案多做處理 1 #include<bits/stdc.h>2 #define N 553 using namespace std;4 struct rec5 {6 double x,y;7 };8 rec…

python讀xml文件

# -*- coding:utf-8 -*- import jsonimport requestsimport oscurpathos.path.dirname(os.path.realpath(__file__))xmlpathos.path.join(curpath,read1.xml)with open(xmlpath,encoding"utf-8") as fp: bodyfp.read() print(body)轉載于:https://www.cnblogs.…

C語言數組應用

一、數組的內存布局 先看下面的例子&#xff1a;int a[5];所有人都明白這里定義了一個數組&#xff0c;其包含了5 個int 型的數據。我們可以用a[0],a[1]等來訪問數組里面的每一個元素&#xff0c;那么這些元素的名字就是a[0],a[1]…嗎&#xff1f;看下面的示意圖&#xff1a; 如…

Installation failed, deleting ./composer.json.安裝phpunit報錯解決方案

是因為你沒有裝全局的phpunit&#xff0c;安裝命令 composer global require phpunit/phpunit 之后你輸入 composer require --dev phpunit/phpunit 就發現你安裝成功了

MyBatis在Oracle中插入數據并返回主鍵的問題解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 前言&#xff1a;我早期用過這個方法&#xff0c;但是返回的依舊是影響行數&#xff0c;不是主鍵。 只是這種寫法可以達到我要的效果&a…

在 Intellij IDEA 里使用 OpenJFX (JavaFX)

2019獨角獸企業重金招聘Python工程師標準>>> JDK 11 把 JavaFX 剝離了出來&#xff0c;形成了單獨且開源的 OpenJFX 模塊。 本文的目的是通過簡單的例子解釋這一變化對使用 JavaFX 所造成的影響&#xff0c;并找到一種在 IDEA 2018.2 上使用它的辦法。 首先&#xf…

使用phpunit新建項目

1、mkdir test-project 新建一個test-project 2、cd test-project 跑到文件夾中 3、實例化git git init 4、新建phpunit項目 composer require --dev phpunit/phpunit 5、使用gi實例化.gitignore gi composer>.gitignore (如果沒有安裝gi&#xff0c;請使用命令ec…

如何解決eclipse里面tomcat 8080端口被占用

很多時候運行tomcat 的時候總是會提示tomcat 的端口被占用 但是任務管理器里面還找不到是哪個端口被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的端口號 &#xff0c;其實這么做太麻煩了 &#xff0c;小弟在這里告訴你一個非常簡單的方法。 1.在開始菜單中選擇運行 …

Selenium UI 舉例 getCssValue

selenium jar包中&#xff0c;在WebElement的接口中&#xff0c; String getCssValue(String var1);可以通過標簽&#xff0c;獲取對應的css值。具體要怎么用呢&#xff0c;如下&#xff1a; WebElement baidu driver.findElement(By.id("su"));su.getCssValue(&quo…

java集合框架中contains(),containsKey()和containsValue()的用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 java集合框架中contains(),containsKey()和containsValue()的用法&#xff1a; List集合的contains()方法用于判斷集合中包不包含某個元…

敏捷視頻

規模化極限編程的關鍵抓手&#xff1a;驗收條件https://mp.weixin.qq.com/s/aHlSxpMx7DTQXaoEgcAQ3g 5分鐘讓你子解持續集成https://www.bilibili.com/video/BV1SK411W77W/?spm_id_fromtrigger_reload 5分鐘讓你學會返工率降低1倍的神技--開卡、驗卡https://www.bilibili.com/…

提問的智慧

提問的智慧轉載于:https://www.cnblogs.com/whigym/p/10028642.html

C語言指針和數組概述

幾乎每次講課講到指針和數組時&#xff0c;我總會反復不停的問學生&#xff1a;到底什么是指針&#xff1f;什么是數組&#xff1f;他們之間到底是什么樣的關系。從幾乎沒人能回答明白到幾乎都能回答明白&#xff0c;需要經歷一段“慘絕人寰”的痛。指針是C/C的精華&#xff0c…

Linux tee的花式用法和pee

1.tee多重定向 tee [options] FILE1 FILE2 FILE3... tee的作用是將一份標準輸入多重定向&#xff0c;一份重定向到標準輸出/dev/stdout&#xff0c;然后還將標準輸入重定向到每個文件FILE中。 例如&#xff1a; $ cat alpha.log | tee file1 file2 file3 | cat $ cat alpha.log…

[CF893F]Subtree Minimum Query

題目大意&#xff1a; 給你一顆有根樹&#xff0c;點有權值&#xff0c;m次詢問&#xff0c;每次問你某個點的子樹中距離其不超過k的點的權值的最小值。&#xff08;邊權均為1&#xff0c;點權有可能重復&#xff0c;k值每次詢問有可能不同&#xff0c;強制在線&#xff09; 做…