найти JSON по ключу в MySQL - PullRequest
       1

найти JSON по ключу в MySQL

0 голосов
/ 31 августа 2018

У меня есть столбец профилей, в котором есть JSON. Как искать во всех полях для поиска конкретного Ника. Ник может быть в utf-8, поэтому регулярное выражение не подходит для решения.

{
  "nick1": {
    "color": [
      1,
      1,
      1
    ],
    "highlight": [
      1,
      1,
      1
    ],
    "global": false,
  },
  "nick2": {
    "color": [
      1,
      0.15,
      0.15
    ],
    "highlight": [
      0.2,
      1,
      0.2
    ],
    "global": true,
  },
  "other_nick": {
    "color": [
      1,
      1,
      1
    ],
    "highlight": [
      1,
      1,
      1
    ],
    "global": false,
}

1 Ответ

0 голосов
/ 02 сентября 2018

Прежде всего, ваш JSON искажен. Вы не можете поставить запятую после последнего элемента в объекте.

  "global": false,
},

должно быть

  "global": false
},

И вам не хватает закрывающей скобки рядом с последними строками:

    "global": false,
}

должно быть

    "global": false
  }
}

Итак, я полагаю, что вы не , используя MySQL 5.7 JSON тип данных. Если бы вы были, это не позволило бы вам сохранить искаженный JSON. Это дало бы эту ошибку:

ОШИБКА 3140 (22032): Неверный текст JSON: «Отсутствует имя для члена объекта». в позиции 138 в значении для столбца '...'.

Как только я исправил формат, я смог проверить ваш JSON.

mysql [localhost] {msandbox} (test) > create table j (j json);

mysql [localhost] {msandbox} (test) > insert into j set j = '...your json...';

Тогда я мог бы извлечь запись для данного ника:

mysql [localhost] {msandbox} (test) > select j->'$.nick2' from j;
+------------------------------------------------------------------------+
| j->'$.nick2'                                                           |
+------------------------------------------------------------------------+
| {"color": [1, 0.15, 0.15], "global": true, "highlight": [0.2, 1, 0.2]} |
+------------------------------------------------------------------------+

Если я пытаюсь извлечь путь для ключа, который не существует, я получаю NULL:

mysql [localhost] {msandbox} (test) > select j->'$.nick3' from j;
+--------------+
| j->'$.nick3' |
+--------------+
| NULL         |
+--------------+

Оператор -> поддерживается в MySQL 5.7 и более поздних версиях. Доступ к нему также возможен как функция JSON_EXTRACT(). См https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

Вы можете сказать: «Я использую MySQL 5.6, как я могу сделать то же самое?»

Если вы хотите использовать JSON в MySQL, вам следует обновить его до 5.7 или более поздней. В MySQL 5.6 и более ранних версиях нет поддержки JSON. Если вы хотите увидеть, сколько усилий потребуется для анализа JSON в MySQL 5.6, посмотрите ответы здесь: Как получить значения из столбца MySQL (5.6), если он содержит документ json в виде строки , и обратите внимание чтобы получить функцию, которая наконец работает, нужны ответы нескольких людей.

Я полагаю, что для обновления до MySQL 5.7 меньше работы, чем вырвать волосы с помощью MySQL 5.6 для анализа JSON с такими запутанными хранимыми функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...