MySQL JSONField Nested Array SUM - PullRequest
       36

MySQL JSONField Nested Array SUM

0 голосов
/ 24 октября 2018

У меня есть простая таблица внутри базы данных MySQL 8.0, например:

+-----------+---------+----------+
| id        | data    |created   |
+-----------+---------+----------+
| INT       | JSON    |Timestamp |
+-----------+---------+----------+

Я могу заполнить свой JSONField, используя:

INSERT INTO mytable (`data`) VALUES ('{
    "File": {
        "Files": {
            "Accounts": {
                "Account": [{
                    "AccountID": "11",
                    "AccountDescription": "CASH",
                    "Balance": "600.00"
                }, {
                    "AccountID": "111",
                    "AccountDescription": "Cash",
                    "Balance": "600.00"
                }]
            }
        }
    }
}');

И что я хочу, это извлечь SUM всех значений баланса.

Я пробовал это:

SELECT SUM(JSON_UNQUOTE(JSON_EXTRACT(`data`, '$.File.Files.Accounts.Account[*].Balance'))) as 'result' FROM mytable WHERE id = 1;

Но дает результат:

+-----------+
| result    |
+-----------+
| 0         |
+-----------+

Кроме того, если я избавлюсь от SUM результат:

+-----------------------+
| result                |
+-----------------------+
| ["600.00", "600.00"]  |
+-----------------------+

Что заставляет меня поверить, что JSON_UNQUOTE не работает и с этим вложенным массивом SELECT.

Как я могу запросить таблицу (без пользовательскихфункции предпочтительно), так что это дает:

+-----------+
| result    |
+-----------+
| 1200      |
+-----------+

1 Ответ

0 голосов
/ 25 октября 2018

Чтобы получить желаемый результат, вы можете использовать JSON Table Functions в MySQL 8.0.Он преобразует данные JSON в табличную форму. Затем вы можете использовать статистическую функцию для результата.

Запрос для достижения того же результата приведен ниже

SELECT sum(result) as result
  FROM mytable,
   JSON_TABLE(
    `data`,
     '$.File.Files.Accounts.Account[*]' COLUMNS(           
          NESTED PATH '$.Balance' COLUMNS (result DECIMAL PATH '$')           
    )
) AS jt;

Ссылка на скрипку БД приведена ниже
https://www.db -fiddle.com / f / vrn55vY2TMeVsVAzy9CS1w / 11

Дополнительную информацию о табличных функциях JSON можно найти ниже
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

...