10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

12.18.3查询JSON值的函数

本节中的函数对JSON值执行搜索或比较操作,以从中提取数据,报告数据是否存在于其中的某个位置,或报告数据在其中的路径。的成员()操作员也被记录在这里。

  • JSON_CONTAINS (目标候选人(,路径])

    通过返回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_docone_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列值一个路径表达式路径(一个字符串字面量),以下三个表达式返回相同的值:

    ->>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_KEYS (json_doc(,路径])

    从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_doc1json_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_docone_or_allsearch_str(,escape_char(,路径]…])

    返回JSON文档中给定字符串的路径。返回如果有任何json_docsearch_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_VALUE (json_doc路径

    在指定文档中给定的路径从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列索引

  • 价值成员(json_array

    返回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。