>  기사  >  데이터 베이스  >  mysql에서 json_extract를 사용하는 방법

mysql에서 json_extract를 사용하는 방법

WBOY
WBOY앞으로
2023-05-31 16:58:161803검색

    1. 서문

    mysql5.7 버전에서 JSON 유형 필드 지원 시작
    json_extract는 ->
    json_unquote(json_extract())로 완전히 축약될 수 있습니다. ->> ;… 이름": "tom", "score": [100, 90, 87], "address": {"city": "Changsha", "province": "Hunan"}}

    2

    [1, "apple ", "red ", {"age": 18, "name": "tom"}]3. 기본 구문- JSON 객체의 키에 해당하는 값을 가져옵니다In json_extract 함수에서 첫 번째 One 매개변수 내용은 json 데이터를 나타내고 두 번째 매개변수는 json 경로입니다. 여기서 $는 json 데이터 자체를 나타내고 $.name은 json에서 키 이름으로 값을 가져오는 것을 나타냅니다. json_extract대신 -> 표현식을 사용하세요. 획득한 값 자체가 문자열인 경우 획득한 값은 "tom"과 같이 따옴표로 묶입니다. "tom" 으로 이스케이프될 수 있습니다. 이 문제를 해결하려면 json_unquote 함수의 다른 레이어를 외부에 래핑하거나 ->
    content:

    {"age": 18, "name": "tom 대신 ->> " , “점수”: [100, 90, 87], “주소”: {“도시”: “창사”, “지방”: “후난”}}

    CREATE TABLE `test_json` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `content` json DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

    - JSON 배열에서 요소 가져오기
    • json_extract 함수에서 첫 번째 매개변수 내용은 json 데이터를 나타내고 두 번째 매개변수는 json 경로입니다. 여기서 $는 json 데이터 자체를 나타내고 $[i]는 json 배열의 인덱스 i가 있는 요소 가져오기를 나타냅니다( 인덱스는 0부터 시작)
    • key-val을 얻는 것과 동일하게, 얻은 요소가 문자열인 경우 기본 방법은 큰따옴표로 묶인 문자도 가져오므로 프로그램이 이스케이프되도록 하는 방법도 사용됩니다. json_unquote 함수를 사용하거나 ->
    • content:
    [1, "apple", "red", {"age": 18, "name": "tom"} 대신 ->> ]

    # 插入两条测试用的记录
    INSERT INTO `test_json` (`content`) VALUES ('{\"name\":\"tom\",\"age\":18,\"score\":[100,90,87],\"address\":{\"province\":\"湖南\",\"city\":\"长沙\"}}');
    INSERT INTO `test_json` (`content`) VALUES ('[1, "apple", "red", {"age": 18, "name": "tom"}]');

    - JSON 데이터에 중첩 가져오기

    앞서 소개한 두 가지 획득 방법과 결합하면 json data

      content: id=1
    • {"age": 18, "name"에서 중첩 데이터를 얻을 수 있습니다. : "tom", "score": [ 100, 90, 87], “address”: {“city”: “Changsha”, “province”: “Hunan”}}

      content: id=2

      [1, “ apple", "red", {"age": 18, "name": "tom"}]
    • # 得到"tom"
      select json_extract(content,'$.name') from test_json where id = 1;
      # 简写方式:字段名->表达式等价于json_extract(字段名,表达式)
      select content->'$.name' from test_json where id = 1;
      # 结果:
      +--------------------------------+
      | json_extract(content,'$.name') |
      +--------------------------------+
      | "tom"                          |
      +--------------------------------+
      +-------------------+
      | content->'$.name' |
      +-------------------+
      | "tom"             |
      +-------------------+
      
      # 解除双引号,得到tom
      select json_unquote(json_extract(content,'$.name')) from test_json where id = 1;
      # 简写方式:字段名->>表达式等价于json_unquote(json_extract(字段名,表达式))
      select content->>'$.name' from test_json where id = 1;
      # 结果:
      +----------------------------------------------+
      | json_unquote(json_extract(content,'$.name')) |
      +----------------------------------------------+
      | tom                                          |
      +----------------------------------------------+
      +--------------------+
      | content->>'$.name' |
      +--------------------+
      | tom                |
      +--------------------+

      4. 점점 나아짐

    • - 여러 JSON 경로에서 데이터 가져오기
    는 여러 경로의 데이터를 배열 및 return


    content : id=1
    {"age": 18, "name": "tom", "score": [100, 90, 87], "address": {"city": " Changsha", "province": " Hunan"}}

    # 得到"apple"
    select json_extract(content,'$[1]') from test_json where id = 2;
    # 简写,效果同上
    select content->'$[1]' from test_json where id = 2;
    # 结果:
    +------------------------------+
    | json_extract(content,'$[1]') |
    +------------------------------+
    | "apple"                      |
    +------------------------------+
    +-----------------+
    | content->'$[1]' |
    +-----------------+
    | "apple"         |
    +-----------------+
    
    # 解除双引号,得到apple 
    select json_unquote(json_extract(content,'$[1]')) from test_json where id = 2;
    # 简写,效果同上
    select content->>'$[1]' from test_json where id = 2;
    # 结果:
    +--------------------------------------------+
    | json_unquote(json_extract(content,'$[1]')) |
    +--------------------------------------------+
    | apple                                      |
    +--------------------------------------------+
    +------------------+
    | content->>'$[1]' |
    +------------------+
    | apple            |
    +------------------+

    - 경로 표현식 *

    을 사용하면 여러 경로의 데이터를 배열로 결합하고

    # 得到:87
    select content->'$.score[2]' from test_json where id = 1;
    # 结果:
    +-----------------------+
    | content->'$.score[2]' |
    +-----------------------+
    | 87                    |
    +-----------------------+
    
    # 得到:18
    select content->'$[3].age' from test_json where id = 2;
    # 结果:
    +---------------------+
    | content->'$[3].age' |
    +---------------------+
    | 18                  |
    +---------------------+


    content: id=3
    {"name을 반환합니다. ": "tom", "class ": {"id": 3, "name": "1년에 세 수업"}, "friend": [{"age": 20, "name": "marry"}, {"age": 21, " name": "Bob"}], "address": {"city": "Changsha", "name": "Central Park"}}

    select json_extract(content,'$.age','$.score') from test_json where id = 1;
    # 结果:
    +-----------------------------------------+
    | json_extract(content,'$.age','$.score') |
    +-----------------------------------------+
    | [18, [100, 90, 87]]                     |
    +-----------------------------------------+
    
    select json_extract(content,'$.name','$.address.province','$.address.city') from test_json where id = 1;
    # 结果:
    +----------------------------------------------------------------------+
    | json_extract(content,'$.name','$.address.province','$.address.city') |
    +----------------------------------------------------------------------+
    | ["tom", "湖南", "长沙"]                                              |
    +----------------------------------------------------------------------+

    - NULL 값을 반환합니다

    content: id=1

    { “age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “Changsha”, “province” : “Hunan”}}

    검색 중인 JSON 경로가 하나도 존재하지 않습니다

    # 先插入一条用于测试的数据
    INSERT INTO `test_json` (`id`,`content`) VALUES(3,'{"name":"tom","address":{"name":"中央公园","city":"长沙"},"class":{"id":3,"name":"一年三班"},"friend":[{"age":20,"name":"marry"},{"age":21,"name":"Bob"}]}')

    경로에 NULL이 있습니다
    # 获取所有二级嵌套中key=name的值
    # 由于friend的二级嵌套是一个数组,所以.name获取不到其中的所有name值
    select content->'$.*.name' from test_json where id = 3;
    +----------------------------------+
    | content->'$.*.name'              |
    +----------------------------------+
    | ["一年三班", "中央公园"]         |
    +----------------------------------+```
    
    # 获取所有key为name值的数据,包括任何嵌套内的name
    select content->'$**.name' from test_json where id = 3;
    +---------------------------------------------------------+
    | content->'$**.name'                                     |
    +---------------------------------------------------------+
    | ["tom", "一年三班", "marry", "Bob", "中央公园"]         |
    +---------------------------------------------------------+
    
    # 获取数组中所有的name值
    select content->'$.friend[*].name' from test_json where id = 3;
    +-----------------------------+
    | content->'$.friend[*].name' |
    +-----------------------------+
    | ["marry", "Bob"]            |
    +-----------------------------+

    - 오류를 반환합니다

    첫 번째 매개 변수가 JSON 형식 데이터가 아닌 경우 오류가 발생합니다. return

    # age路径不存在,返回NULL
    # 若有多个路径,只要有一个路径存在则不会返回NULL
    select json_extract(content,'$.price') from test_json where id = 1;
    +---------------------------------+
    | json_extract(content,'$.price') |
    +---------------------------------+
    | NULL                            |
    +---------------------------------+
    경로 표현식이 표준화되지 않은 경우 오류가 반환됩니다.

    # 存在任意路径为NULL则返回NULL
    select json_extract(content,'$.age',NULL) from test_json where id = 1;
    +------------------------------------+
    | json_extract(content,'$.age',NULL) |
    +------------------------------------+
    | NULL                               |
    +------------------------------------+

    5. 사용 시나리오

    JSON_EXTRACT 함수는 일반적으로 JSON에서 특정 데이터를 가져오거나 이를 판단 조건으로 사용하는 데 사용됩니다

    위 내용은 mysql에서 json_extract를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제