如何在 Db2 的 JSON_OBJECT 的 VALUE 子句中使用标量子查询?
How to use a scalar subquery in Db2's JSON_OBJECT's VALUE clause?
我正在尝试从 Db2 LUW v11.5.4.0 中的标量子查询创建 JSON_OBJECT()
:
SELECT
JSON_OBJECT(KEY 'x' VALUE (SELECT 1 FROM sysibm.dual))
FROM sysibm.dual;
这会产生
An unexpected token ")" was found following "1 from sysibm.dual)". Expected tokens may include: "<interval_qualifier>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.26.14
类似的查询在 Oracle 中有效,但我没有看到,from the documentation,我在 Db2 中做错了什么。如何从标量子查询构造 JSON_OBJECT()
?
这些 hacks,可能还有其他 hacks,似乎有效:
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
相同)。
我正在尝试从 Db2 LUW v11.5.4.0 中的标量子查询创建 JSON_OBJECT()
:
SELECT
JSON_OBJECT(KEY 'x' VALUE (SELECT 1 FROM sysibm.dual))
FROM sysibm.dual;
这会产生
An unexpected token ")" was found following "1 from sysibm.dual)". Expected tokens may include: "<interval_qualifier>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.26.14
类似的查询在 Oracle 中有效,但我没有看到,from the documentation,我在 Db2 中做错了什么。如何从标量子查询构造 JSON_OBJECT()
?
这些 hacks,可能还有其他 hacks,似乎有效:
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
相同)。