Mysql Json Extract - выбор подстановочного знака ключа

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

{
  RootData: {
    202003: {
      201903: {
        "abc": 123,
        xyz: 456
      },
      data1: {
        
      },
      data2: {
        
      }
    }
  }
}

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

select blah blah,
 JSON_EXTRACT(convert(columnname using utf8), '$.RootData."202003"."201903".abc') as blah

В приведенном выше запросе мой вопрос вращается вокруг части '$.RootData."202003"."201903".abc'

Я НЕ хочу жестко кодировать часть 201903 и ищу синтаксис, в котором он может выбирать узел с помощью подстановочных знаков.

Я пробовал следующие варианты без везения

'$.RootData."202003"."20*".abc'

'$.RootData."202003".[1].abc'

'$.RootData."202003".$.20*.abc'

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

Вы должны: использовать JSON_KEYS и получить все существующие ключи; проверить ключи на соответствие вашему условию/шаблону и отфильтровать несоответствующие; используйте совпадающие ключи, стройте соответствующие пути (используя общие строковые функции) и извлекайте соответствующие значения.

Akina 24.12.2020 06:14

Вы можете использовать путь как '$.RootData."202003"**.abc'. Результат будет в виде массива. Обратитесь - db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/0

Prasanna 24.12.2020 07:02

Если вам нужен результат в виде отдельных значений, может быть другая выдержка из результата как -db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/1

Prasanna 24.12.2020 07:09

@Prasanna Большое спасибо, что изучили это. Это работает. Однако, когда я сказал $[0], я получаю весь json обратно в набор результатов.

Suresh Atta 24.12.2020 07:21

@SureshAtta, странно. Если быть точным, есть 2 JSON_EXTRACT. Внутренний будет использовать **, а внешний - '$[0]'. Можете ли вы воспроизвести проблему в db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/1?

Prasanna 24.12.2020 07:33

@Prasanna Мой плохой. Не заметил второй экстракт json. Попробую это. В любом случае, не могли бы вы добавить это в качестве ответа. ?

Suresh Atta 24.12.2020 07:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
6
1 398
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Путь в форме $.RootData."202003"**.abc должен помочь.

Обратитесь - https://www.db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/0

Тип результата будет массивом. Чтобы получить результат первого совпадения, его можно вложить в другой JSON_EXTRACT, как показано ниже.

select JSON_EXTRACT(JSON_EXTRACT(convert(data using utf8), '$.RootData."202003"**.abc'), '$[0]')
from rootdata;

Другие вопросы по теме