本节中的函数对JSON值执行搜索或比较操作,以从中提取数据,报告数据是否存在于其中的某个位置,或报告数据在其中的路径。的成员()
操作员也被记录在这里。
通过返回1或0来指示是否给定
候选人
JSON文档包含在目标
JSON文档,或者如果一个路径
参数—是否在目标内的特定路径上找到候选对象。返回零
如果任何论点是零
,或者如果path参数没有标识目标文档的某个部分。如果发生错误目标
或候选人
不是一个有效的JSON文档,或者如果路径
参数不是有效的路径表达式或包含*
或**
通配符。如果只检查该路径下是否有数据,请使用
JSON_CONTAINS_PATH ()
代替。以下规则定义了容器:
当且仅当候选标量具有可比性且相等时,候选标量包含在目标标量中。如果两个标量值具有相同的值,则它们是可比较的
JSON_TYPE ()
类型,但类型的值除外整数
而且小数
也可以互相比较。当且仅当候选数组中的每个元素都包含在目标数组的某些元素中时,候选数组才包含在目标数组中。
当且仅当候选非数组包含在目标数组的某些元素中时,候选非数组才包含在目标数组中。
候选对象包含在目标对象中,当且仅当候选对象中的每个键在目标中都有一个同名的键,并且与候选键相关联的值包含在与目标键相关联的值中。
否则,候选值就不包含在目标文档中。
从MySQL 8.0.17开始,查询使用
JSON_CONTAINS ()
在InnoDB
可以使用多值索引优化表;看到多值的索引,以获取更多信息。mysql >设置@j = '{“a”:1、“b”:2,“c”:{“d”:4}}';mysql> SET @j2 = '1';SELECT JSON_CONTAINS(@j, @j2, '$ a');+-------------------------------+ | JSON_CONTAINS (@j @j2,”美元。 ') | +-------------------------------+ | 1 | +-------------------------------+ mysql >选择JSON_CONTAINS (@j、@j2美元。b);+-------------------------------+ | JSON_CONTAINS (@j @j2,”美元。b ') | +-------------------------------+ | 0 | +-------------------------------+ mysql >设置@j2 = '{“d”:4}';SELECT JSON_CONTAINS(@j, @j2, '$ a');+-------------------------------+ | JSON_CONTAINS (@j @j2,”美元。 ') | +-------------------------------+ | 0 | +-------------------------------+ mysql >选择JSON_CONTAINS (@j @j2, ' $ c ');+-------------------------------+ | JSON_CONTAINS (@j, @j2 $ . c ') | +-------------------------------+ | 1 | +-------------------------------+
JSON_CONTAINS_PATH (
json_doc
,one_or_all
,路径
(,路径
]…)返回0或1,表示JSON文档是否包含给定路径上的数据。返回
零
如果任何论点是零
.如果错误发生json_doc
参数不是一个有效的JSON文档,any路径
参数不是有效的路径表达式,或one_or_all
不是“一个”
或“所有”
.要检查路径上的特定值,请使用
JSON_CONTAINS ()
代替。如果文档中不存在指定的路径,则返回值为0。否则,返回值取决于
one_or_all
论点:“一个”
:如果文档中至少存在一个路径,则为1,否则为0。“所有”
: 1表示文档中所有路径都存在,否则为0。
mysql >设置@j = '{“a”:1、“b”:2,“c”:{“d”:4}}';mysql> SELECT JSON_CONTAINS_PATH(@j, ' 1 ', '$。,即美元);+---------------------------------------------+ | JSON_CONTAINS_PATH (@j '一',' $。”、“即美元 ') | +---------------------------------------------+ | 1 | +---------------------------------------------+ mysql >选择JSON_CONTAINS_PATH (@j,“所有”,“美元。,即美元);+---------------------------------------------+ | JSON_CONTAINS_PATH (@j,“所有”、“美元。”、“即美元 ') | +---------------------------------------------+ | 0 | +---------------------------------------------+ mysql >选择JSON_CONTAINS_PATH (@j,“一个”,“.c.d美元”);+----------------------------------------+ | JSON_CONTAINS_PATH (@j,‘一个’,‘.c.d美元 ') | +----------------------------------------+ | 1 | +----------------------------------------+ mysql >选择JSON_CONTAINS_PATH (@j,“一个”,“.a.d美元”);+----------------------------------------+ | JSON_CONTAINS_PATH (@j,‘一个’,‘.a.d美元 ') | +----------------------------------------+ | 0 | +----------------------------------------+
JSON_EXTRACT (
json_doc
,路径
(,路径
]…)方法匹配的文档部分中选择的JSON文档返回数据
路径
参数。返回零
如果任何论点是零
或者没有路径定位文档中的值。如果错误发生json_doc
参数不是一个有效的JSON文档或任何路径
参数不是有效的路径表达式。方法匹配的所有值
路径
参数。如果这些参数可能返回多个值,则匹配的值将自动包装为一个数组,顺序与产生它们的路径相对应。否则,返回值是单个匹配的值。mysql >选择JSON_EXTRACT(“[10年,20年,[30 40]]','[1]美元');+--------------------------------------------+ | JSON_EXTRACT(“[10年,20年,[30 40]]','[1美元 ]') | +--------------------------------------------+ | 20 | +--------------------------------------------+ mysql >选择JSON_EXTRACT(“[10年,20年,[30 40]]”,“[1]美元”,“[0]美元”);+----------------------------------------------------+ | JSON_EXTRACT(“[10年,20年,[30 40]]”,“[1]美元”,“[0美元 ]') | +----------------------------------------------------+ | [ 20日10 ] | +----------------------------------------------------+ mysql >选择JSON_EXTRACT(“[10年,20年,[30 40]]',' $ [2][*]');+-----------------------------------------------+ | JSON_EXTRACT(“[10年,20年,[30 40]]','[2美元 ][*]') | +-----------------------------------------------+ | [ 30、40 ] | +-----------------------------------------------+
MySQL支持
->
运算符作为这个函数的简写,就像使用两个参数时左手边是a一样JSON
列标识符(不是表达式),右边是要在列中匹配的JSON路径。的
->
的别名JSON_EXTRACT ()
函数在使用两个参数时使用,左边的列标识符和右边的JSON路径(字符串字面量),该路径根据JSON文档(列值)计算。在SQL语句中出现列引用的地方,可以使用这样的表达式来代替列引用。这两个
选择
这里显示的语句产生相同的输出:SELECT c, JSON_EXTRACT(c, "$.id"), g > FROM jemp > WHERE JSON_EXTRACT(c, "$.id") > 1 > ORDER BY JSON_EXTRACT(c, "$.name");+-------------------------------+-----------+------+ | c | c - > " $。id”| g | +-------------------------------+-----------+------+ | {" id”:“3”、“名称”:“巴尼”}| 3 | 3 | | {" id ":“4”、“名称”:“贝蒂”}|“4”| 4 | | {" id ":“2”,“名字”:“威尔玛”}|“2”| 2 | +-------------------------------+-----------+------+ 3行集(0.00秒)mysql >选择c, c - > " $。id", g > FROM jemp > WHERE c->"$。id" > 1 > ORDER BY ->"$.name";+-------------------------------+-----------+------+ | c | c - > " $。id”| g | +-------------------------------+-----------+------+ | {" id”:“3”、“名称”:“巴尼”}| 3 | 3 | | {" id ":“4”、“名称”:“贝蒂”}|“4”| 4 | | {" id ":“2”,“名字”:“威尔玛”}|“2”| 2 | +-------------------------------+-----------+------+ 3行集(0.00秒)
此功能不限于
选择
,如下所示:修改表为字段添加INT查询OK, 0 rows affected(0.68秒)Records: 0 duplicate: 0 Warnings: 0 mysql> UPDATE jemp SET n=1 WHERE c->"$. txt "id”=“4”;查询结果:1更改:1警告:0 mysql> SELECT c, c->"$。id", g, n > FROM jemp > WHERE JSON_EXTRACT(c, "$.id") > 1 > ORDER BY c->"$.name";+-------------------------------+-----------+------+------+ | c | c - > " $。id”| | g n | +-------------------------------+-----------+------+------+ | {" id”:“3”、“名称”:“巴尼”}| 3 | 3 |零| | {" id ":“4”、“名称”:“贝蒂”}|“4”| 4 | 1 | | {" id ":“2”,“名字”:“威尔玛”}|“2”| 2 | NULL | +-------------------------------+-----------+------+------+ 3行集(0.00秒)mysql >删除从jemp c - >”。id”=“4”;查询mysql>的值。id", g, n > FROM jemp > WHERE JSON_EXTRACT(c, "$.id") > 1 > ORDER BY c->"$.name";+-------------------------------+-----------+------+------+ | c | c - > " $。id”| | g n | +-------------------------------+-----------+------+------+ | {" id”:“3”、“名称”:“巴尼”}| 3 | 3 |零| | {" id ":“2”,“名字”:“威尔玛”}|“2”| 2 | NULL | +-------------------------------+-----------+------+------+ 2行集(0.00秒)
(见为生成的列建立索引以提供JSON列索引,用于创建和填充表的语句。)
这也适用于JSON数组值,如下所示:
创建表tj10(一个JSON,一个INT)INSERT INTO tj10 > VALUES ("[3,10,5,17,44]", 33), ("[3,10,5,17,[22,44,66]]", 0);SELECT a->"$[4]" FROM tj10;+--------------+ | - >“[4美元 ]" | +--------------+ | 44 | |(22日,66 ] | +--------------+ 2行集(0.00秒)mysql > SELECT *从tj10 - >“[0]美元”= 3;+------------------------------+------+ | a | | +------------------------------+------+ | [ 3、10、5、17日,44]33 | | |(3、10、5、17日[22日66]]| 0 | +------------------------------+------+ 2行集(0.00秒)
支持嵌套数组。一个表达式使用
->
评估作为零
如果在目标JSON文档中没有找到匹配的键,如下所示:SELECT * FROM tj10 WHERE a->"$[4][1]" IS NOT NULL+------------------------------+------+ | a | | +------------------------------+------+ | [ 3、10、5、17日[22日66]]| 0 | +------------------------------+------+ mysql >选择- >“美元[4][1]“tj10;+--------------+ | - >”[4][1美元 ]" | +--------------+ | 零| | 44 | +--------------+ 2行集(0.00秒)
这与使用时在这种情况下看到的行为相同
JSON_EXTRACT ()
:SELECT JSON_EXTRACT("$[4][1]") FROM tj10;+----------------------------+ | JSON_EXTRACT (a,”[4][1美元 ]") | +----------------------------+ | 零| | 44 | +----------------------------+ 2行集(0.00秒)
这是一个改进的、取消引号的提取操作符。而
->
操作符只是提取一个值->>
运算符还将提取的结果取消引号。换句话说,给定aJSON
列值列
一个路径表达式路径
(一个字符串字面量),以下三个表达式返回相同的值:JSON_UNQUOTE (
列
->
路径
)列
->>路径
的
->>
Operator可用于任何地方JSON_UNQUOTE (JSON_EXTRACT ())
将被允许。这包括(但不限于)选择
列表,在哪里
而且有
条款,命令
而且集团
条款。接下来的几个语句演示了一些
->>
方法中其他表达式的等价运算符mysql客户:SELECT * FROM jemp WHERE g > 2;+-------------------------------+------+ | c | g | +-------------------------------+------+ | {" id”:“3”、“名称”:“巴尼”}| 3 | | {" id ":“4”、“名称”:“贝蒂”}| 4 | +-------------------------------+------+ 2行(0.01秒)mysql >选择c - > $ . name的名字——>从jemp g > 2;+----------+ | 的名字 | +----------+ | " 巴尼“| |”贝蒂 " | +----------+ 2行(0.00秒)mysql >选择JSON_UNQUOTE (c - > $ . name)的名字——>从jemp g > 2;+--------+ | 的名字 | +--------+ | 巴尼| |贝蒂 | +--------+ 2行(0.00秒)mysql >选择c - > > . name美元的名字——>从jemp g > 2;+--------+ | 的名字 | +--------+ | 巴尼| |贝蒂 | +--------+ 2行集(0.00秒)
看到为生成的列建立索引以提供JSON列索引,用于创建和填充
jemp
表中所示的例子。这个操作符也可以用于JSON数组,如下所示:
创建表tj10(一个JSON,一个INT)查询好,0行影响(0.26秒)mysql >插入tj10价值观——>(“[3、10、5、“x”,44]”,33),- - - - - - >(“[3、10、5、17日[22,66年" y "]] ', 0);SELECT a->"$[3]", a->"$[4][1]" FROM tj10;+-----------+--------------+ | “[3]美元”——> | - >”[4][1美元 ]" | +-----------+--------------+ | " 17 x”零| | | |“y " | +-----------+--------------+ 2行(0.00秒)mysql >选择- > > " $ [3]",a - > > " $[4][1]“tj10;+------------+---------------+ | a - > > |“[3]美元”——> >”[4][1美元 ]" | +------------+---------------+ | 17 x零| | | | y | +------------+---------------+ 2行集(0.00秒)
与
->
,->>
运算符总是在的输出中展开解释
,如下面的例子所示:mysql >解释选择c - > > . name美元的名字——>从jemp g > 2 \ g *************************** 1。row *************************** id: 1 select_type: SIMPLE table: jemp partitions: NULL type: range possible_keys: i key: i key_len: 5 ref: NULL rows: 2 filtered: 100.00 Extra: Using where 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1。行 *************************** 水平:注意代码:1003信息:/ *选择# 1 * /选择json_unquote (json_extract(“jtest”。“jemp”。' c ', ' $ . name '))从jtest的“名字”。“jemp”(“jtest”。“jemp”的地方。' g ' > 2)设置1行(0.00秒)
这类似于MySQL如何扩展
->
操作员在相同的情况下。从JSON对象的顶级值返回一个JSON数组的键
路径
参数,则所选路径的顶级键。返回零
如果任何论点是零
,json_doc
参数不是一个对象,或者路径
,如果给出,则不定位对象。如果错误发生json_doc
参数不是一个有效的JSON文档路径
参数不是有效的路径表达式或包含*
或**
通配符。如果所选对象为空,则结果数组为空。如果顶级值有嵌套的子对象,则返回值不包括来自这些子对象的键。
mysql >选择JSON_KEYS('{“a”:1、“b”:{“c”:30}}”);+---------------------------------------+ | JSON_KEYS('{“a”:1、“b”:{“c”:30 }}') | +---------------------------------------+ | [" a”、“b "] | +---------------------------------------+ mysql >选择JSON_KEYS('{“a”:1、“b”:{“c”:30}}”,“美元。b”);+----------------------------------------------+ | JSON_KEYS('{“a”:1、“b”:{“c”:30}}”,“美元。b ') | +----------------------------------------------+ | [" c "] | +----------------------------------------------+
JSON_OVERLAPS (
json_doc1
,json_doc2
)比较两个JSON文档。如果两个文档有任何相同的键值对或数组元素,则返回true(1)。如果两个参数都是标量,函数执行一个简单的等式检验。
此函数对应于
JSON_CONTAINS ()
,它要求所搜索的数组的所有元素都出现在所搜索的数组中。因此,JSON_CONTAINS ()
执行一个和
操作搜索键,而JSON_OVERLAPS ()
执行一个或
操作。的JSON列的查询
InnoDB
表的使用JSON_OVERLAPS ()
在在哪里
子句可以使用多值索引进行优化。多值的索引,提供了详细信息和示例。当比较两个数组时,
JSON_OVERLAPS ()
如果它们共用一个或多个数组元素,则返回true,否则返回false:mysql >选择JSON_OVERLAPS(“(1、3、5、7)”、“(2、5、7)”);+---------------------------------------+ | JSON_OVERLAPS(“(1、3、5、7)”、“(2、5、7 ]") | +---------------------------------------+ | 1 | +---------------------------------------+ 1行组(0.00秒)mysql >选择JSON_OVERLAPS(“(1、3、5、7)”、“(2、6、7)”);+---------------------------------------+ | JSON_OVERLAPS(“(1、3、5、7)”、“(2、6、7 ]") | +---------------------------------------+ | 1 | +---------------------------------------+ 1行组(0.00秒)mysql >选择JSON_OVERLAPS(“(1、3、5、7)”、“(2、6、8)”);+---------------------------------------+ | JSON_OVERLAPS(“(1、3、5、7)”、“(2、6、8 ]") | +---------------------------------------+ | 0 | +---------------------------------------+ 1行集(0.00秒)
部分匹配被视为不匹配,如下所示:
mysql >选择JSON_OVERLAPS(“[[1、2],[3,4],5]”,“[1,[2、3],[4,5]]”);+-----------------------------------------------------+ | JSON_OVERLAPS(“[[1、2],[3,4],5]”,“[1[2、3],[4 5 ]]') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+ 1行集(0.00秒)
当比较对象时,如果它们至少有一个相同的键值对,则结果为真。
mysql >选择JSON_OVERLAPS('{“a”:1、“b”:10“d”:10}’,‘{“c”:1、“e”:10“f”:1、“d”:10}”);+-----------------------------------------------------------------------+ | JSON_OVERLAPS('{“a”:1、“b”:10“d”:10}’,‘{“c”:1、“e”:10“f”:1、“d”:10 }') | +-----------------------------------------------------------------------+ | 1 | +-----------------------------------------------------------------------+ 1行组(0.00秒)mysql >选择JSON_OVERLAPS(“{“a”:1、“b”:10“d”:10}’,‘{“e”:“一”:5日10日“f”:1、“d”:20}”);+-----------------------------------------------------------------------+ | JSON_OVERLAPS('{“a”:1、“b”:10“d”:10}’,‘{“e”:“一”:5日10日“f”:1、“d”:20 }') | +-----------------------------------------------------------------------+ | 0 | +-----------------------------------------------------------------------+ 1行集(0.00秒)
如果使用两个标量作为函数的参数,
JSON_OVERLAPS ()
执行一个简单的相等测试:SELECT JSON_OVERLAPS('5', '5');+-------------------------+ | JSON_OVERLAPS (' 5 ', ' 5 ') | +-------------------------+ | 1 | +-------------------------+ 1行组(0.00秒)mysql >选择JSON_OVERLAPS(“5”、“6”);+-------------------------+ | JSON_OVERLAPS(“5”、“6 ') | +-------------------------+ | 0 | +-------------------------+ 1行集(0.00秒)
当将标量与数组比较时,
JSON_OVERLAPS ()
尝试将标量作为数组元素处理。在本例中,第二个参数6
被解释为[6]
,如下所示:SELECT JSON_OVERLAPS('[4,5,6,7]', '6');+---------------------------------+ | JSON_OVERLAPS('(4、5、6、7)”,“6 ') | +---------------------------------+ | 1 | +---------------------------------+ 1行集(0.00秒)
该函数不执行类型转换:
mysql> SELECT JSON_OVERLAPS('[4,5,"6",7]', '6');+-----------------------------------+ | JSON_OVERLAPS('(4、5、“6”、7]”,“6 ') | +-----------------------------------+ | 0 | +-----------------------------------+ 1行组(0.00秒)mysql >选择JSON_OVERLAPS(’(4、5、6、7)”,“6”);+-----------------------------------+ | JSON_OVERLAPS('(4、5、6、7)”,“6 "') | +-----------------------------------+ | 0 | +-----------------------------------+ 1行集(0.00秒)
JSON_OVERLAPS ()
在MySQL 8.0.17中添加。JSON_SEARCH (
json_doc
,one_or_all
,search_str
(,escape_char
(,路径
]…])返回JSON文档中给定字符串的路径。返回
零
如果有任何json_doc
,search_str
,或路径
参数是零
;没有路径
存在于文件中;或search_str
没有找到。如果错误发生json_doc
参数不是一个有效的JSON文档,any路径
参数不是一个有效的路径表达式,one_or_all
不是“一个”
或“所有”
,或escape_char
不是一个常量表达式。的
one_or_all
论证对搜索的影响如下:“一个”
:搜索在第一次匹配后终止并返回一个路径字符串。未定义哪个匹配被优先考虑。“所有”
:返回所有匹配的路径字符串,不包含重复的路径。如果有多个字符串,它们将被自动包装为数组。数组元素的顺序未定义。
在
search_str
搜索字符串参数%
而且_
字符的工作就像就像
接线员:%
匹配任意数量的字符(包括零字符),并且_
只匹配一个字符。要指定一个字面量
%
或_
搜索字符串中的字符,在其前面加上转义字符。默认值是\
如果escape_char
参数缺失或零
.否则,escape_char
必须是一个空的常量或一个字符。有关匹配和转义字符行为的详细信息,请参见
就像
在第12.8.1节,“字符串比较函数和操作符”.对于转义字符处理,与就像
行为的转义字符为JSON_SEARCH ()
必须在编译时计算为常数,而不仅仅是在执行时。例如,如果JSON_SEARCH ()
在准备好的语句中使用,而escape_char
参数是使用?
参数时,参数值在执行时可能是常量,但在编译时不是。search_str
而且路径
总是被解释为utf8mb4字符串,而不管它们的实际编码。这是一个已知的问题,在MySQL 8.0.24中修复(Bug #32449181)。mysql >设置@j = '[“abc”,[{“k”:“10”},“def”),{“x”:“abc”},{“y”:“bcd”}]”;SELECT JSON_SEARCH(@j, 'one', 'abc');+-------------------------------+ | JSON_SEARCH (@j,‘一个’,”美国广播公司 ') | +-------------------------------+ | "$[ 0 ]" | +-------------------------------+ mysql >选择JSON_SEARCH (@j,“所有”,“abc”);+-------------------------------+ | JSON_SEARCH (@j,“所有”、“abc ') | +-------------------------------+ | ["$[ 0]”、“美元[2]。x "] | +-------------------------------+ mysql >选择JSON_SEARCH (@j,“所有”、“全球健康行动计划”);+-------------------------------+ | JSON_SEARCH (@j,“所有”、“全球健康行动计划 ') | +-------------------------------+ | 零 | +-------------------------------+ mysql >选择JSON_SEARCH (@j,‘所有’,‘10’);+------------------------------+ | JSON_SEARCH (@j,“所有”、“10 ') | +------------------------------+ | "$[ 1][0]。k " | +------------------------------+ mysql >选择JSON_SEARCH (@j,‘所有’,‘10’,NULL,“美元”);+-----------------------------------------+ | JSON_SEARCH (@j,‘所有’,‘10’,NULL , '$') | +-----------------------------------------+ | "$[ 1][0]。k " | +-----------------------------------------+ mysql >选择JSON_SEARCH (@j,‘所有’,‘10’,NULL , '$[*]');+--------------------------------------------+ | JSON_SEARCH (@j,‘所有’,‘10’,NULL , '$[*]') | +--------------------------------------------+ | "$[ 1][0]。k " | +--------------------------------------------+ mysql >选择JSON_SEARCH (@j,‘所有’,‘10’,NULL,美元* *同意);+---------------------------------------------+ | JSON_SEARCH (@j,‘所有’,‘10’,NULL,“美元* *同意 ') | +---------------------------------------------+ | "$[ 1][0]。k " | +---------------------------------------------+ mysql >选择JSON_SEARCH (@j,‘所有’,‘10’,NULL,“[*][0]同意美元”);+-------------------------------------------------+ | JSON_SEARCH (@j,‘所有’,‘10’,NULL,“美元[*][0]同意 ') | +-------------------------------------------------+ | "$[ 1][0]。k " | +-------------------------------------------------+ mysql >选择JSON_SEARCH (@j,‘所有’,‘10’,NULL,[1]美元); +--------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$[1]') | +--------------------------------------------+ | "$[1][0].k" | +--------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]'); +-----------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]') | +-----------------------------------------------+ | "$[1][0].k" | +-----------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]'); +---------------------------------------------+ | JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]') | +---------------------------------------------+ | "$[2].x" | +---------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%a%'); +-------------------------------+ | JSON_SEARCH(@j, 'all', '%a%') | +-------------------------------+ | ["$[0]", "$[2].x"] | +-------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%b%'); +-------------------------------+ | JSON_SEARCH(@j, 'all', '%b%') | +-------------------------------+ | ["$[0]", "$[2].x", "$[3].y"] | +-------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]'); +---------------------------------------------+ | JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]') | +---------------------------------------------+ | "$[0]" | +---------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]'); +---------------------------------------------+ | JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]') | +---------------------------------------------+ | "$[2].x" | +---------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]'); +---------------------------------------------+ | JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]') | +---------------------------------------------+ | NULL | +---------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[1]'); +-------------------------------------------+ | JSON_SEARCH(@j, 'all', '%b%', '', '$[1]') | +-------------------------------------------+ | NULL | +-------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[3]'); +-------------------------------------------+ | JSON_SEARCH(@j, 'all', '%b%', '', '$[3]') | +-------------------------------------------+ | "$[3].y" | +-------------------------------------------+
有关MySQL支持的JSON路径语法的更多信息,包括控制通配符操作符的规则
*
而且**
,请参阅JSON路径语法.在指定文档中给定的路径从JSON文档中提取值,并返回提取的值,并可选地将其转换为所需的类型。完整的语法如下所示:
JSON_VALUE (json_doc,路径(返回类型] [on_empty] [on_error])on_empty: {null | error | default价值}在空on_error: {null | error | default价值}上的错误
json_doc
是一个有效的JSON文档。路径
是指向文档中某个位置的JSON路径。这必须是一个字符串字面值。类型
是以下数据类型之一:方法支持的(非数组)类型与刚才列出的类型相同
把()
函数。如果没有指定
返回
条款,JSON_VALUE ()
函数的返回类型是VARCHAR (512)
.当没有为返回类型指定字符集时,JSON_VALUE ()
使用utf8mb4
使用二进制排序规则,区分大小写;如果utf8mb4
如果指定为结果的字符集,服务器将对此字符集使用不区分大小写的默认排序规则。当指定路径上的数据由JSON空文本组成或解析为JSON空文本时,该函数返回SQL
零
.on_empty
,如果指定,则确定如何JSON_VALUE ()
在给定的路径上没有找到数据时的行为;该子句接受以下值之一:零空
:函数返回零
;这是默认值在空
的行为。默认的
:所提供的价值
在空价值
返回。值的类型必须与返回类型匹配。误差在空
:函数抛出一个错误。
如果使用,
on_error
当发生错误时,使用下列值之一和相应的结果,如下所示:空上的错误
:JSON_VALUE ()
返回零
;如果没有,这是默认行为在错误
使用条款。默认的
:这是返回值;它的值必须与返回类型匹配。价值
在错误错误在错误
:抛出错误。
在空
,如果使用,必须在any之前在错误
条款。以错误的顺序指定它们会导致语法错误。错误处理。通常,错误由
JSON_VALUE ()
如下:检查所有JSON输入(文档和路径)的有效性。如果其中任何一个是无效的,则抛出一个SQL错误,而不触发
在错误
条款。在错误
当下列事件发生时触发:试图提取一个对象或数组,例如解析到JSON文档中多个位置的路径所产生的对象或数组
转换错误,例如试图转换
“asdf”
到一个无符号
价值截断值
转换错误总是会触发警告,即使
空上的错误
或默认的…在错误
都是确定的。的
在空
子句触发源JSON文档(expr
)在指定位置不包含任何数据(路径
).
JSON_VALUE ()
在MySQL 8.0.21中引入。的例子。这里展示了两个简单的例子:
mysql >选择JSON_VALUE('{“帧”:“乔”,“lname”:“帕尔默”}”,“.fname美元”);+--------------------------------------------------------------+ | JSON_VALUE('{“帧”:“乔”,“lname”:“帕尔默”}’,‘.fname美元 ') | +--------------------------------------------------------------+ | 乔 | +--------------------------------------------------------------+ mysql >选择JSON_VALUE('{“项”:“鞋”,“价格”:“49.95”}',' $。return DECIMAL(4,2)) AS价格;+-------+ |价格| +-------+ | 49.95 | +-------+
该声明
选择JSON_VALUE (
等价于以下语句:json_doc
,路径
返回类型
)Select cast (json_unquote (json_extract (json_doc,路径))类型);
JSON_VALUE ()
简化了在JSON列上创建索引,使得在许多情况下无需先创建一个生成的列,然后再在生成的列上创建索引。在创建表时可以这样做t1
有一个JSON
通过在使用的表达式上创建索引来列JSON_VALUE ()
对该列进行操作(使用匹配该列值的路径),如下所示:创建表t1(j JSON,索引i1 ((JSON_VALUE(j, '$))id' RETURNING UNSIGNED))));
以下
解释
输出显示查询针对t1
方法中的索引表达式在哪里
子句使用这样创建的索引:SELECT * FROM t1 -> WHERE JSON_VALUE(j, '$。id '返回无符号)= 123 \ G *************************** 1。row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: i1 key: i1 key_len: 9 ref: const rows: 1 filtered: 100.00 Extra: NULL
这与创建表的效果差不多
t2
在生成的列上使用索引(请参见为生成的列建立索引以提供JSON列索引),比如这个:创建表t2 (j JSON, g INT GENERATED ALWAYS AS (j->"$.id"),索引i1 (j))
的
解释
对该表的查询(引用生成的列)的输出显示,索引的使用方式与对表的上一个查询相同t1
:mysql >解释选择从t2 * g = 123 \ g *************************** 1。row *************************** id: 1 select_type: SIMPLE table: t2 partitions: NULL type: ref possible_keys: i1 key: i1 key_len: 5 ref: const rows: 1 filtered: 100.00 Extra: NULL
有关在生成的列上使用索引以间接索引的信息
JSON
列,看到为生成的列建立索引以提供JSON列索引.返回true (1)
价值
是json_array
,否则返回false(0)。价值
必须是标量或JSON文档;如果是标量,操作符将尝试将其视为JSON数组的元素。查询使用
成员()
的JSON列InnoDB
表在哪里
子句可以使用多值索引进行优化。看到多值的索引,以获取详细信息和示例。简单标量被视为数组值,如下所示:
mysql> SELECT 17 MEMBER OF('[23, "abc", 17, "ab", 10]');+-------------------------------------------+ | 17个成员(“[23日“abc”,17日“ab”,10 ]') | +-------------------------------------------+ | 1 | +-------------------------------------------+ 1行组(0.00秒)mysql >选择“ab”的成员(“[23日“abc”,17日“ab”,10]”);+---------------------------------------------+ | ' ab的成员(“[23日“abc”,17日“ab”,10 ]') | +---------------------------------------------+ | 1 | +---------------------------------------------+ 1行集(0.00秒)
数组元素值的部分匹配不匹配:
mysql> SELECT 7 MEMBER OF('[23, "abc", 17, "ab", 10]');+------------------------------------------+ | 7的成员(“[23日“abc”,17日“ab”,10 ]') | +------------------------------------------+ | 0 | +------------------------------------------+ 1行集(0.00秒)
mysql >选择“a”的成员(“[23日“abc”,17日“ab”,10]”);+--------------------------------------------+ | ' 的成员(“[23日“abc”,17日“ab”,10 ]') | +--------------------------------------------+ | 0 | +--------------------------------------------+ 1行集(0.00秒)
不执行与字符串类型之间的转换:
mysql >选择- > 17的成员(“[23日“abc”,“17”、“ab”,10]”),- - - - - - >“17”的成员(“[23日“abc”,17日“ab”,10]”)\ G *************************** 1。行 *************************** 17个成员(“[23日“abc”,“17”、“ab”,10]”):0“17”的成员(“[23日“abc”,17日“ab”,10]”):0 1行组(0.00秒)
要对一个本身就是数组的值使用该操作符,必须将其显式转换为JSON数组。你可以用
铸造(…JSON)
:mysql >选择演员(“(4、5)”为JSON)的成员(“[[3,4],[4,5]]”);+--------------------------------------------------+ | 铸造((4、5)的JSON)的成员(“[[3,4],[4 5 ]]') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+ 1行集(0.00秒)
控件也可以执行必要的强制转换
JSON_ARRAY ()
函数,如下:mysql >选择JSON_ARRAY(4、5)的成员(“[[3,4],[4,5]]”);+--------------------------------------------+ | JSON_ARRAY(4、5)的成员(“[[3,4],[4 5 ]]') | +--------------------------------------------+ | 1 | +--------------------------------------------+ 1行集(0.00秒)
任何用作测试值或出现在目标数组中的JSON对象都必须强制使用正确的类型
铸造(…JSON)
或JSON_OBJECT ()
.此外,包含JSON对象的目标数组本身必须使用强制转换JSON_ARRAY
.下面的语句序列演示了这一点:mysql> SET @a = CAST('{"a":1}' AS JSON);mysql> SET @b = JSON_OBJECT("b", 2);SET @c = JSON_ARRAY(17, @b,“abc”,@a, 23);mysql> SELECT (@c成员),@b成员(@c成员)+------------------+------------------+ | @ 的一员(@c) | @b (@c的成员 ) | +------------------+------------------+ | 1 | 1 | +------------------+------------------+ 1行集(0.00秒)
的
成员()
在MySQL 8.0.17中添加了operator。