Чтение JSON из MEMSQL

Возникла проблема с JSON/MEMSQL. Вот моя таблица:

CREATE TABLE `MEMSQLPOLYGLOT`  ( 
    ID BIGINT AUTO_INCREMENT,
    `DATA`  JSON NULL,
    PRIMARY KEY (ID)
);

Вот запись, которую я пытаюсь прочитать:

 insert into MEMTEST (DATA) values 
('
{
    "EnterpriseMessage" : 
        {
            "Body" :
            [
                {
                    "AccountNumber":"ABCD",
                    "AdminCompany":null,
                    "BrokerNumber":"WWonka"
                },
                {
                    "AccountNumber":"CSNE",
                    "AdminCompany":null,
                    "BrokerNumber":"ZWiza"
                }
            ],
        "Header" :
            {
                "mimetye":"application/vnd.ms-powerpoint",
                "destinationsystem":"ETL",
                "requiresack":"FALSE",
                "SimpArr": 
                    [
                        "BYTS6181",
                        "EVU98124",
                        "Genesys"
                    ],
                "EmptyFile":1
            }
    }

}
');

Я могу прочитать массив SimpArr в заголовке.

SELECT DATA::EnterpriseMessage::Header::SimpArr from MEMTEST;

Возвращает:

["BYTS6181","EVU98124","Genesys"]

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

select JSON_EXTRACT_JSON(DATA::EnterpriseMessage::Body, 1) from MEMTEST;

Это возвращает второе значение SimpArr, так как это индекс с отсчетом от нуля.

Я также могу прочитать массив объектов в теле:

select JSON_EXTRACT_JSON(DATA::EnterpriseMessage::Body, 0) from MEMTEST;

который возвращает первый объект в этом массиве:

{
    "AccountNumber":"ABCD",
    "AdminCompany":null,
    "BrokerNumber":"WWonka"
}

Однако я не могу найти способ прочитать отдельные атрибуты этого объекта.

У кого-нибудь есть идеи?


person BamBam    schedule 11.08.2016    source источник


Ответы (1)


Вы можете просто передать ключ в качестве дополнительного аргумента JSON_EXTRACT_JSON:

mysql> select JSON_EXTRACT_JSON(DATA::EnterpriseMessage::Body, 0, "AccountNumber") from MEMTEST;
+----------------------------------------------------------------------+
| JSON_EXTRACT_JSON(DATA::EnterpriseMessage::Body, 0, "AccountNumber") |
+----------------------------------------------------------------------+
| "ABCD"                                                               |
+----------------------------------------------------------------------+
1 row in set (0.08 sec)

JSON_EXTRACT_JSON принимает любое количество аргументов, будь то строковые ключи или целочисленные индексы массива. Например, мы можем развернуть синтаксис :: в приведенном выше примере:

select JSON_EXTRACT_JSON(DATA, "EnterpriseMessage", "Body", 0, "AccountNumber") from MEMTEST;

Также обратите внимание, что возвращаемое значение заключено в двойные кавычки. Это потому, что вы извлекаете JSON, а JSON-представление строки имеет двойные кавычки. Если вы действительно хотите получить строку, используйте JSON_EXTRACT_STRING:

mysql> select JSON_EXTRACT_STRING(DATA, "EnterpriseMessage", "Body", 0, "AccountNumber") from MEMTEST;
+----------------------------------------------------------------------------+
| JSON_EXTRACT_STRING(DATA, "EnterpriseMessage", "Body", 0, "AccountNumber") |
+----------------------------------------------------------------------------+
| ABCD                                                                       |
+----------------------------------------------------------------------------+
1 row in set (0.07 sec)
person Ishamael    schedule 21.08.2016