如何在 JSON_ARRAYAGG 中返回不同的值

jwa*_*was 5 oracle plsql

所以我试图将一个不同的单列查询的结果放入一个 JSON 数组中,以便它可以在我的 Web 服务器上使用。我已经设置了这样的东西:

SELECT JSON_OBJECT(
  'ArrayKey' VALUE JSON_ARRAYAGG( col ) 
) AS jsonResult
FROM(SELECT DISTINCT column_name AS col
       FROM tbl_name);
Run Code Online (Sandbox Code Playgroud)

但是,当此查询返回结果时,它在 JSON 中生成的数组包含我的列中的所有值,并以某种方式忽略子查询中的 DISTINCT 子句。每当我摆脱 JSON_ARRAYAGG 子句并直接输出结果时,结果是唯一的,但是当我重新添加它时,命令会被忽略。我也尝试将 DISTINCT 子句放在 JSON_ARRAYAGG 中,就像这样:

SELECT JSON_OBJECT(
  'ArrayKey' VALUE JSON_ARRAYAGG( DISTINCT col ) 
) AS jsonResult
FROM(SELECT DISTINCT column_name AS col
       FROM tbl_name);
Run Code Online (Sandbox Code Playgroud)

无济于事。有谁知道我的代码出了什么问题导致数组输出所有值而不是不同的值?

sti*_*bit 7

有趣...对我来说看起来像是一个错误。优化器似乎过于急切地向下推。

作为解决方法,您可以使用NO_MERGE子查询上的提示。

SELECT /*+NO_MERGE(x)*/
      json_object('ArrayKey'
                  VALUE json_arrayagg(column_name)) jsonresult
      FROM (SELECT DISTINCT
                   column_name
                   FROM tbl_name) x;
Run Code Online (Sandbox Code Playgroud)

CTE 和MATERIALIZE提示似乎也有效。

WITH cte
AS
(
SELECT /*+MATERIALIZE*/ 
       DISTINCT
       column_name
       FROM tbl_name
)
SELECT json_object('ArrayKey'
                   VALUE json_arrayagg(column_name)) jsonresult
       FROM cte;
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴