私有第三方应用程序将JSON字符串存储在它的数据库中,如下所示:
{"state":"complete","timestamp":1614776473000}我需要时间戳,然后发现DB2提供JSON函数。由于它作为字符串存储在PROF_VALUE列中,所以在使用JSON_VAL获取时间戳之前,需要使用SYSTOOLS.JSON2BSON进行转换:
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。
发布于 2021-03-07 17:15:38
我的查询中有两个问题:首先,似乎双引号"是用于对象引用的。我不知道有什么不同,因为在我所使用的大多数数据库中,单'和双引号"都是相等的。
第二个问题是,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'https://stackoverflow.com/questions/66458757
复制相似问题