mariadb json запрос для получения родительских ключей с указанным c дочерним значением - PullRequest
0 голосов
/ 30 января 2020

Я получил клиентов с контрактами, хранящимися в формате json в базе данных mariadb (10.3.21).

Родительские ключи - это идентификаторы типов контрактов, cb = флажок, если контракт отмечен (1) или not (0), p & pt связаны с ценой и не очень актуальны для моего вопроса.

Упрощенный формат json структурирован следующим образом:

{
    "1": {
        "cb": "0",
        "p": "1",
        "pt": "m"
    },
    "2": {
        "cb": "1",
        "p": "395",
        "pt": "y"
    },
    "3": {
        "cb": "0",
        "p": "",
        "pt": "m"
    },
    "7": {
        "cb": "1",
        "p": "120",
        "pt": "m"
    }
}

Я могу запросить базу данных, чтобы получить результаты всех компаний, которые имеют указанный тип контракта c.

SELECT
       `id`
     , `company`
FROM
       `db`.`clients`
WHERE
       JSON_VALUE(`contracts`, '$.2.cb')=1

Но я хочу запросить json, поэтому я получаю массив родительских ключей, где дочерний ключ cb = 1. Так что это даст ["2","7"] как результат для этого json.

Я думал, что-то из следующего, но это не работает. Получение пустого набора результатов вместо того, на что я рассчитывал.

SELECT
       `id`
     , `company`
     , JSON_QUERY(`contracts`, '$') AS `contracttypes`
FROM
       `db`.`clients`
WHERE
       JSON_VALUE(`contracts`, '$.%.cb')=1

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

Альтернативный подход

Пробный альтернативный подход с лучшими результатами, но пока нет.

SELECT
       `id`
     , `company`
     , json_search(`contracts`,'all','1') AS `contracttypes`
FROM
       `db`.`clients`

Результаты: ["$.1.p", "$.2.cb", "$.7.cb"] Ключи элементы cb - это то, что я хочу, но первый ключ из-за элемента p не нужен.

Попытка сделать json_search для ключа со значением, подобным следующему, дает нулевой результат.

json_search(`contracts`,'all','"cb":"1"')

/* or with curlies */

json_search(`contracts`,'all','{"cb":"1"}')

1 Ответ

1 голос
/ 01 февраля 2020

Попробуйте:

SELECT
  REGEXP_REPLACE(
    JSON_SEARCH(@`json`, 'all', '1', NULL, '$**.cb'),
    '[$.]|[.cb]',
    SPACE(0)
  ) `json_result`;

См. dbfiddle .

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