![](/img/trans.png)
[英]DB2 SQL Error: SQLCODE=-901, SQLSTATE=58004, SQLERRMC=Invalid collation ID, DRIVER=4.21.29
[英]SQLSTATE 58004, Error “invalid qnc assigment” when using NULL in JSON_OBJECT() with LISTAGG in DB2 LUW
似乎有一个有趣的功能组合会导致 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,驱动程序=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}]|
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.