> 技术文档 > MySQL中的JSON_CONTAINS函数用法_mysql contains

MySQL中的JSON_CONTAINS函数用法_mysql contains

MySQL中的JSON_CONTAINS函数用于检查一个JSON文档(目标)是否包含另一个JSON文档(搜索值)。以下是其详细用法:

函数语法

JSON_CONTAINS(target_json, search_json [, path])
  • target_json​:要检查的目标JSON文档。
  • search_json​:要搜索的JSON值或结构。
  • path​(可选):指定在目标JSON中的具体路径。若未指定,默认检查整个文档。

返回值​:

  • 1:目标包含搜索值。
  • 0:目标不包含搜索值。
  • NULL:参数为NULL或路径不存在。

使用场景和示例

1. 检查数组是否包含元素
  • 示例表​:

    CREATE TABLE users ( id INT PRIMARY KEY, tags JSON);INSERT INTO users VALUES(1, \'[\"mysql\", \"database\", \"developer\"]\'),(2, \'[\"python\", \"web\", \"tester\"]\'),(3, \'[\"java\", \"backend\", \"developer\"]\');
  • 查询包含\"developer\"标签的用户​:

    SELECT * FROM users WHERE JSON_CONTAINS(tags, \'\"developer\"\', \'$\');

    或简写:

    SELECT * FROM users WHERE JSON_CONTAINS(tags, \'\"developer\"\');

    注意​:字符串需用双引号包裹,外层用单引号。


2. 检查对象是否包含键值对
  • 示例数据​:

    {\"name\": \"Alice\", \"age\": 30, \"skills\": [\"SQL\", \"Java\"]}
  • 查询包含\"name\": \"Alice\"的对象​:

    SELECT * FROM profiles WHERE JSON_CONTAINS(data, \'{\"name\": \"Alice\"}\');

3. 嵌套结构和路径参数
  • 示例数据​:

    {\"department\": {\"team\": [\"Alice\", \"Bob\"], \"id\": 101}}
  • ​**检查team数组是否包含\"Bob\"**​:

    SELECT JSON_CONTAINS( \'{\"department\": {\"team\": [\"Alice\", \"Bob\"], \"id\": 101}}\', \'\"Bob\"\', \'$.department.team\'); -- 返回1

4. 数据类型严格匹配

JSON区分数据类型,如数字3和字符串\"3\"不匹配:

SELECT JSON_CONTAINS(\'[1, 2, 3]\', \'3\'); -- 返回1(数值3)SELECT JSON_CONTAINS(\'[1, 2, \"3\"]\', \'\"3\"\'); -- 返回1(字符串\"3\")SELECT JSON_CONTAINS(\'[1, 2, 3]\', \'\"3\"\'); -- 返回0(类型不匹配)

5. 通配符路径
  • 示例数据​:

    {\"employees\": [{\"name\": \"Alice\"}, {\"name\": \"Bob\"}]}
  • ​**检查任意name是否为\"Bob\"**​:

    SELECT JSON_CONTAINS( \'{\"employees\": [{\"name\": \"Alice\"}, {\"name\": \"Bob\"}]}\', \'\"Bob\"\', \'$.employees[*].name\'); -- 返回1

注意事项

  1. 路径存在性​:若路径不存在,返回NULL

    SELECT JSON_CONTAINS(\'{\"a\": 1}\', \'1\', \'$.b\'); -- 返回NULL
  2. 对象匹配​:搜索对象时,必须完全包含所有键值对。

    SELECT JSON_CONTAINS(\'{\"a\":1, \"b\":2}\', \'{\"a\":1}\'); -- 返回1SELECT JSON_CONTAINS(\'{\"a\":1}\', \'{\"a\":1, \"b\":2}\'); -- 返回0
  3. 数组子集​:搜索数组时,目标数组需包含搜索数组所有元素(顺序无关)。

    SELECT JSON_CONTAINS(\'[1,2,3]\', \'[3,1]\'); -- 返回1SELECT JSON_CONTAINS(\'[1,2,3]\', \'[1,4]\'); -- 返回0

总结

JSON_CONTAINS适用于验证JSON结构中的存在性,需注意:

  • 正确使用路径和数据类型。
  • 对象需完全匹配键值对,数组需包含所有元素。
  • 结合路径通配符(*)可灵活处理嵌套数据。

三亚家庭旅馆预订