oracle-database

JSON Concat in ORACLE


Input table :

Create table TEST_TBL(Item varchar2(100),loc varchar2(100), ATTRIBUTE BLOB);

INSERT INTO TEST_TBL('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST","attrValue":"REC","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
INSERT INTO TEST_TBL('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST1","attrValue":"REC1","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
INSERT INTO TEST_TBL('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST2","attrValue":"REC2","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
INSERT INTO TEST_TBL('CDE','WER',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST5","attrValue":"REC5","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
INSERT INTO TEST_TBL('CDE','WER',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST6","attrValue":"REC6","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
COMMIT;

Desired output would be if item and loc combination is same then Attribute will be concatenated like below:

Output:

INSERT INTO TEST_TBL('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST","attrValue":"REC","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}],            [{"attrName":"TEST1","attrValue":"REC1","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}],            [{"attrName":"TEST2","attrValue":"REC2","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
INSERT INTO TEST_TBL('CDE','WER',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST5","attrValue":"REC5","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}],             [{"attrName":"TEST6","attrValue":"REC6","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));

Solution

  • If you want to display the merged rows then:

    SELECT t.item, t.loc,
           JSON_ARRAYAGG(j.attr FORMAT JSON) AS attrs
    FROM   test_tbl t
           CROSS APPLY JSON_TABLE(
             t.attribute,
             '$[*]'
             COLUMNS(
               attr CLOB FORMAT JSON PATH '$'
             )
           ) j
    GROUP BY item, loc
    

    Which, for the sample data:

    Create table TEST_TBL(
      Item varchar2(100),
      loc varchar2(100),
      ATTRIBUTE BLOB CHECK (attribute IS JSON)
    );
    
    INSERT INTO TEST_TBL (item, loc, attribute) VALUES ('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST","attrValue":"REC","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
    INSERT INTO TEST_TBL (item, loc, attribute) VALUES ('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST1","attrValue":"REC1","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
    INSERT INTO TEST_TBL (item, loc, attribute) VALUES ('ABC','XYZ',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST2","attrValue":"REC2","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
    INSERT INTO TEST_TBL (item, loc, attribute) VALUES ('CDE','WER',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST5","attrValue":"REC5","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
    INSERT INTO TEST_TBL (item, loc, attribute) VALUES ('CDE','WER',UTL_RAW.CAST_TO_RAW('[{"attribute":[{"attrName":"TEST6","attrValue":"REC6","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]'));
    COMMIT;
    

    Outputs:

    ITEM LOC ATTRS
    ABC XYZ [{"attribute":[{"attrName":"TEST","attrValue":"REC","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]},{"attribute":[{"attrName":"TEST2","attrValue":"REC2","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]},{"attribute":[{"attrName":"TEST1","attrValue":"REC1","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]
    CDE WER [{"attribute":[{"attrName":"TEST5","attrValue":"REC5","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]},{"attribute":[{"attrName":"TEST6","attrValue":"REC6","attrOperator":"EQUAL","attrOverrideParam":"Priority","attrOverrideValue":0}]}]

    fiddle