如何在 Db2 的 JSON_OBJECT 的 VALUE 子句中使用标量子查询?

问题描述 投票:0回答:3

我正在尝试从 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()

sql json db2
3个回答
2
投票

这些技巧,可能还有其他技巧,似乎有效:

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;

1
投票

我会将标量子查询从

SELECT
列表移动到
LATERAL
部分,这将是完全相同的。它还应该满足解析器:

SELECT JSON_OBJECT(KEY 'x' VALUE my_scalar)
FROM sysibm.dual, LATERAL(SELECT 1 AS my_scalar FROM sysibm.dual);

db<>小提琴演示


编辑:

破解功能:

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

这里

MAX
,因为它接受单个参数并且不更改数据类型(与
COALESCE
/
DECODE
相同)。


0
投票

另一种解决方案是将json对象定义为varchar字符串,以便可以在屏幕上显示。

选择 varchar( JSON_OBJECT(KEY 'x' VALUE MAX((从 sysibm.sysdummy1 选择 1)))
,100) 来自 sysibm.sysdummy1

© www.soinside.com 2019 - 2024. All rights reserved.