При извлечении атрибута из строки 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'