programing

JSON_ARRAYAGG에서 고유 값을 반환하는 방법

stoneblock 2023. 10. 11. 20:28

JSON_ARRAYAGG에서 고유 값을 반환하는 방법

그래서 저는 별개의 단일 열 질의 결과를 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 절을 제거하고 결과를 직접 출력할 때마다 결과는 고유하지만 명령어는 다시 추가하면 무시됩니다.또한 JSON_ARRAYAGG 내부에 DISTINCT 절을 다음과 같이 배치하려고 했습니다.

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

헛되이배열이 고유 값이 아닌 모든 값을 출력하게 하는 내 코드에서 무엇이 잘못되고 있는지 아는 사람?

흥미로운...제가 보기엔 벌레 같은데요.옵티마이저가 너무 열심히 밀고 있는 것 같습니다.

이를 해결하기 위해 사용할 수 있습니다.NO_MERGE서브쿼리의 힌트

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

ACTE와 AMATERIALIZE힌트도 되는 것 같아요.

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

db<> fid들

이건 버그였어요, 우리가 고쳤어요.라이브 SQL에서 사용해 볼 수 있습니다.

create table tbl_name (column_name number);
insert into tbl_name values(1);
insert into tbl_name values(1);
insert into tbl_name values(2);


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

{"ArrayKey" : [1,2]}

버그는 Bug 27757725 - JSON GENERATION AGENATION FECTESIGN DISTINCT 당신은 Oracle Support Services에 백포트를 요청할 수 있습니다.

나는 이 해킹이 효과가 있다는 것을 알았습니다.

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

참고 항목:Oracle 버그가 JSON_ARRAYAGG에서 중복된 Aggregate 값을 생성함

언급URL : https://stackoverflow.com/questions/55736219/how-to-return-distinct-values-in-a-json-arrayagg