SQLSTATE 58004,在JSON_OBJECT()中将NULL与DB2 LUW中的LISTAGG一起使用时,错误“无效的qnc赋值”

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

似乎有一些有趣的功能组合,这些错误导致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

很可能是解析器中的错误。似乎没有什么明显的错误。如何防止/解决此问题?

sql json db2 db2-luw
1个回答
0
投票

[我已经找到了一些解决方法,我想在这里进行记录,以防万一有人遇到这种情况:

将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}]|
© www.soinside.com 2019 - 2024. All rights reserved.