我正在尝试从 Db2 LUW v11.5.4.0 中这样的标量子查询创建
JSON_OBJECT()
:
SELECT
JSON_OBJECT(KEY 'x' VALUE (SELECT 1 FROM sysibm.dual))
FROM sysibm.dual;
这会产生
在“1 from sysibm.dual)”后面发现了意外的标记“)”。 预期的标记可能包括:“
”.. SQLCODE=-104、SQLSTATE=42601、DRIVER=4.26.14
类似的查询在 Oracle 中也有效,从文档中我没有看到我在 Db2 中做错了什么。如何从标量子查询构造
JSON_OBJECT()
?
这些技巧,可能还有其他技巧,似乎有效:
SELECT
JSON_OBJECT(KEY 'x' VALUE COALESCE(NULL, (SELECT 1 FROM sysibm.dual)))
FROM sysibm.dual;
SELECT
JSON_OBJECT(KEY 'x' VALUE DECODE(1, 1, (SELECT 1 FROM sysibm.dual)))
FROM sysibm.dual;
我会将标量子查询从
SELECT
列表移动到 LATERAL
部分,这将是完全相同的。它还应该满足解析器:
SELECT JSON_OBJECT(KEY 'x' VALUE my_scalar)
FROM sysibm.dual, LATERAL(SELECT 1 AS my_scalar FROM sysibm.dual);
编辑:
破解功能:
SELECT JSON_OBJECT(KEY 'x' VALUE MAX((SELECT 1 FROM sysibm.dual)))
FROM sysibm.dual;
这里
MAX
,因为它接受单个参数并且不更改数据类型(与COALESCE
/DECODE
相同)。
另一种解决方案是将json对象定义为varchar字符串,以便可以在屏幕上显示。
选择 varchar(
JSON_OBJECT(KEY 'x' VALUE MAX((从 sysibm.sysdummy1 选择 1)))
,100)
来自 sysibm.sysdummy1