似乎有一些有趣的功能组合,这些错误导致Db2 LUW v11.5.0.0中出现错误。要复制,请写:
CREATE TABLE t (a INT);
INSERT INTO t VALUES (1), (2);
SELECT '[' || listagg(
json_object(
KEY 'a' VALUE a,
KEY 'b' VALUE b
), ','
) WITHIN GROUP (ORDER BY a) || ']'
FROM (
SELECT a, NULL b
FROM t
ORDER BY a
);
我正在使用LISTAGG
解决Db2 LUW缺少的JSON_ARRAYAGG
支持。
我得到的错误是这个:
SQL语句或命令由于数据库系统错误而失败。 (原因为“无效的qnc分配”。)。 SQLCODE = -901,SQLSTATE = 58004,DRIVER = 4.7.85
很可能是解析器中的错误。似乎没有什么明显的错误。如何防止/解决此问题?
[我已经找到了一些解决方法,我想在这里进行记录,以防万一有人遇到这种情况:
将NULL文字转换为特定类型
SELECT '[' || listagg(
json_object(
KEY 'a' VALUE a,
KEY 'b' VALUE b
), ','
) WITHIN GROUP (ORDER BY a) || ']'
FROM (
SELECT a, CAST(NULL AS VARCHAR(1)) b -- Workaround here
FROM t
ORDER BY a
);
投射JSON_OBJECT中的值
可能无法知道b
的类型,它也可以是数字而不是字符串。
SELECT '[' || listagg(
json_object(
KEY 'a' VALUE a,
KEY 'b' VALUE CAST(b AS VARCHAR(32672)) -- Workaround here
), ','
) WITHIN GROUP (ORDER BY a) || ']'
FROM (
SELECT a, NULL b
FROM t
ORDER BY a
);
删除ORDER BY子句,在这种情况下是不需要的(可能存在FETCH FIRST
子句)
SELECT '[' || listagg(
json_object(
KEY 'a' VALUE a,
KEY 'b' VALUE b
), ','
) WITHIN GROUP (ORDER BY a) || ']'
FROM (
SELECT a, NULL b
FROM t
-- Workaround here
);
添加一个“混淆” NULL值的表达式
SELECT '[' || listagg(
json_object(
KEY 'a' VALUE a,
KEY 'b' VALUE COALESCE(b, NULLIF(1, 1)) -- Workaround here
), ','
) WITHIN GROUP (ORDER BY a) || ']'
FROM (
SELECT a, NULL b
FROM t
ORDER BY a
);
所有这些都能产生所需的
1 |
-----------------------------------|
[{"a":1,"b":null},{"a":2,"b":null}]|