sql - 使用 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 和值 = 完整。
解决方案
我的查询中有两个问题:首先,双引号似乎"
是对象引用。我不知道有什么区别,因为在我使用的大多数数据库中,单'
引号和双引号"
都是相等的。
第二个问题是,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'
推荐阅读
- javascript - 需要帮助在特定坐标处叠加图像(OpenStreetMap、OpenLayers)
- laravel - 如何在从 Forge 现场部署之前查看您的网站更改?
- c - C中的循环#defines
- java - 如何使用 UDP 套接字向不同地址和不同端口上的多个节点发送消息?
- java - Java 正则表达式。如何获取文本的 3 个不同部分?
- ads - 使用 Google Ads Api 获取广告报告
- javascript - ReactJS部署应用程序错误无法复制到剪贴板:命令失败:xsel --clipboard --input
- android - xamarin.Android 应用程序中的 .cs 和 .fs 文件有什么区别?
- javascript - 如何使用 XMLHttpRequest() 正确循环 HTTP 请求?
- amazon-web-services - 在哪里可以找到提供有关 ec2 关闭信息的日志