首页 > 解决方案 > 使用 JSON_VAL 原因从 JSON 字符串中获取属性“在使用的上下文中无效”错误

问题描述

一个专有的第三方应用程序将 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

这给了我一个单行表:类型 = 2 和值 = 完整。

标签: sqljsondb2ibm-connectionshcl-connections

解决方案


我的查询中有两个问题:首先,双引号似乎"对象引用。我不知道有什么区别,因为在我使用的大多数数据库中,单'引号和双引号"都是相等的。

第二个问题是,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'

推荐阅读