Как вернуть отдельные значения в JSON_ARRAYAGG - PullRequest
3 голосов
/ 18 апреля 2019

Итак, я пытаюсь поместить результаты отдельного запроса в один столбец в массив JSON, чтобы его можно было использовать на моем веб-сервере.У меня есть что-то вроде этого:

SELECT JSON_OBJECT(
  'ArrayKey' VALUE JSON_ARRAYAGG( col ) 
) AS jsonResult
FROM(SELECT DISTINCT column_name AS col
       FROM tbl_name);

Однако, когда этот запрос возвращает результаты, массив, который он генерирует в 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);

безрезультатно.Кто-нибудь знает, что происходит в моем коде, из-за чего массив выводит все значения вместо отдельных?

1 Ответ

2 голосов
/ 18 апреля 2019

Интересно ... Похоже, ошибка для меня.Оптимизатор, кажется, нажимает слишком охотно.

В качестве обходного пути вы можете использовать подсказку NO_MERGE в подзапросе.

SELECT /*+NO_MERGE(x)*/
      json_object('ArrayKey'
                  VALUE json_arrayagg(column_name)) jsonresult
      FROM (SELECT DISTINCT
                   column_name
                   FROM tbl_name) x;

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;

дБ <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...