Поиск…


Вступление

MySQL 5.7.8+ поддерживает собственный тип JSON. Хотя у вас есть разные способы создания json-объектов, вы можете просматривать и читать их по-разному.

Основной функцией является JSON_EXTRACT , поэтому операторы -> и ->> более дружелюбны.

Синтаксис

  • JSON_EXTRACT (json_doc, путь [...])
  • JSON_EXTRACT (json_doc, путь)
  • JSON_EXTRACT (json_doc, путь1, путь2)

параметры

параметр Описание
json_doc действительный документ JSON
дорожка путь участников

замечания

Упоминается в MySQL 5.7 Справочное руководство

  • Несколько согласованных значений по аргументам пути

Если возможно, что эти аргументы могут возвращать несколько значений, сопоставленные значения автоматически переносятся в виде массива в порядке, соответствующем путям, которые их создавали. В противном случае возвращаемое значение будет единственным согласованным значением.

  • NULL Результат, когда:
    • любой аргумент - NULL
    • путь не соответствует

Возвращает NULL, если любой аргумент равен NULL, или нет путей для определения значения в документе.

Чтение значения JSON Array

Создайте переменную @myjson как тип JSON ( подробнее ):

 SET @myjson = CAST('["A","B",{"id":1,"label":"C"}]' as JSON) ;

SELECT некоторых членов!

 SELECT
   JSON_EXTRACT( @myjson , '$[1]' ) ,
   JSON_EXTRACT( @myjson , '$[*].label') ,
   JSON_EXTRACT( @myjson , '$[1].*' ) ,
   JSON_EXTRACT( @myjson , '$[2].*')
 ;
 -- result values:
 '\"B\"', '[\"C\"]', NULL, '[1, \"C\"]'
 -- visually:
 "B", ["C"], NULL, [1, "C"]

Операторы извлечения JSON

Извлечь path помощью -> или ->> Операторы, а ->> значение UNQUOTED:

 SELECT
   myjson_col->>'$[1]' , myjson_col->'$[1]' ,
   myjson_col->>'$[*].label' ,
   myjson_col->>'$[1].*' ,
   myjson_col->>'$[2].*'
 FROM tablename ;
  -- visuall:
     B, "B" , ["C"], NULL, [1, "C"]
  --^^^ ^^^

Таким образом, col->>path равен JSON_UNQUOTE(JSON_EXTRACT(col,path)) :

Как и в случае ->, оператор - >> всегда выводится в вывод EXPLAIN, как показано в следующем примере:

mysql> EXPLAIN SELECT c->>'$.name' AS name   
    ->     FROM jemp WHERE 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. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select
json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from
`jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)
1 row in set (0.00 sec)

Читайте о выводе строки inline (+)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow