При извлечении атрибута из строки JSON с JSON_VAL причина ошибки «<атрибут> недопустим в используемом контексте»

Проприетарное стороннее приложение хранит строки JSON в своей базе данных, например:

      {"state":"complete","timestamp":1614776473000}

Мне нужна метка времени, и я узнал, что DB2 предлагает функции JSON . Поскольку он хранится в виде строки в PROF_VALUE столбец, я предполагаю, что преобразование с SYSTOOLS.JSON2BSON требуется, прежде чем я смогу использовать JSON_VAL чтобы получить метку времени:

      SELECT SYSTOOLS.JSON_VAL(SYSTOOLS.JSON2BSON(PROF_VALUE), "timestamp", "f")
FROM EMPINST.PROFILE_EXTENSIONS ext
WHERE PROF_PROPERTY_ID = 'touchpointState'

Это вызывает ошибку, заключающуюся в том, что метка времени недействительна в используемом контексте (SQLCODE = -206, SQLSTATE = 42703, DRIVER = 4.26.14). Та же ошибка появляется, когда я удаляю JSON2BSON позвони так

      SELECT SYSTOOLS.JSON_VAL(PROF_VALUE, "timestamp", "f")

Также не работает с той же ошибкой (разные типы данных):

      SELECT SYSTOOLS.JSON_VAL(SYSTOOLS.JSON2BSON(PROF_VALUE), "state", "s:1000")
SELECT SYSTOOLS.JSON_VAL(PROF_VALUE) "state", "s:1000")

Я не понимаю эту ошибку. Мой синтаксис похож на задокументированный JSON_VAL ( json-value , search-string , result-type) и это то же самое, что и в примерах, где показано, как получить name поле объекта.

Я также немного поигрался с JSON_TABLE использовать необработанные входные данные для тестирования (вместо данных базы данных), но, похоже, это не подходит для этого.

      SELECT *
FROM TABLE(SYSTOOLS.JSON_TABLE( SYSTOOLS.JSON2BSON('{"state":"complete","timestamp":1614776473000}'), 'state','s:32')) DATA

Это дало мне таблицу с одной строкой: Type = 2 и Value = complete.

1 ответ

В моем запросе возникли две проблемы: сначала кажется, что двойные кавычки предназначены для ссылок на объекты . Я не знал, что есть какая-то разница, потому что в большинстве баз данных, которые я еще использовал, оба одиночных ' и двойные кавычки " равны.

Вторая проблема в том, что JSON_VAL нужно называть без SYSTOOLS, но ссылка на SYSTOOLS.JSON2BSON(PROF_VALUE).

С этими изменениями работал следующий запрос:

      SELECT JSON_VAL(SYSTOOLS.JSON2BSON(PROF_VALUE), 'timestamp', 'f')
FROM EMPINST.PROFILE_EXTENSIONS ext
WHERE PROF_PROPERTY_ID = 'touchpointState'
Другие вопросы по тегам