如何在 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);

db<>fiddle demo


编辑:

破解函数:

SELECT JSON_OBJECT(KEY 'x' VALUE MAX((SELECT 1 FROM sysibm.dual)))
FROM sysibm.dual;

这里MAX因为它接受一个参数并且不改变数据类型(与COALESCE/DECODE相同)。