Я получил клиентов с контрактами, хранящимися в формате 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"}')