MySQL JSON: поиск значения элемента-брата в подмассиве - PullRequest
0 голосов
/ 21 мая 2019

У меня есть следующий (псевдо) JSON в столбце типа JSON (LONGTEXT) в моем MariaDB 10.2

{"order":
    {"otherstuff":...},
    {"dates":
        [
            {
            "typeId":2,
            "date":"2019-05-21 09:00:00"
            },
            {
            "typeId":4,
            "date":"2019-05-21 10:00:00"
            }
        ]
    }
}

Мне нужна дата заказа, пока я знаю, какой тип мне нужен (4). В заказе может быть несколько дат, идентифицированных по их typeId. typeId 4 не всегда находится на второй позиции.

SELECT JSON_UNQUOTE(JSON_SEARCH(`json`, 'one', 4, NULL, '$.dates[*].typeId'))
// gives me: $.dates[1].typeId

Моя первая мысль была о REPLACE typeId с датой, но это жалуется на смешанные сопоставления. Как бы я (более элегантно) ссылался на значение 'date' здесь?

Кроме того, запрос должен быть выражением столбца GENERATED в моей таблице. Поскольку дата id4 не обязательно указана для каждого заказа, я попробовал это:

SELECT IF(4 IN (JSON_EXTRACT(json, '$.dates[*].typeId')), 'yes', 'no')
// above condition evaluates to [2, 4]

Я обрезал '[' и ']', но тогда он дает мне только «да», если 4 является первым в массиве (это массив?). Итак (без скобок):

[4, 7] -> да

[2, 4] -> нет

Я предполагаю, что это не распознается как массив значений, а как строка. Тогда почему это дает мне «да», если моя игла находится в первом положении?

Вместо да и нет, я, очевидно, хочу использовать дату и NULL.

Функции MySQL JSON для меня совершенно новые. Так, может, кто-нибудь может указать мне правильное направление?

1 Ответ

0 голосов
/ 22 мая 2019

Попробуйте:

Вариант 1 :

SELECT
  JSON_UNQUOTE(
    JSON_EXTRACT(
      `json`,
      REPLACE(
        JSON_UNQUOTE(
          JSON_SEARCH(
            `json`,
            'one',
            4,
            NULL,
            '$.order.dates[*].typeId'
          )
        ),
        'typeId',
        'date'
      )
    )
  ) `date`;

Вариант 2 :

SELECT
  IF(
    JSON_CONTAINS(
      JSON_EXTRACT(
        `json`,
        '$.order.dates[*].typeId'
      ),
      4
    ),
    'yes',
    'no'
  ) `exists`;

См. dbfiddle .

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