用于创建 json 的雪花查询 - 单个属性的多个结果

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

我有一个雪花表,其中三个不同的列用作名称类型/值。这些需要使用 json 在 MDM 工具中进行映射。当然,我不能多次使用相同的属性名称,否则会发生错误。

名称类型1 名称类型2 名称类型3
AL_PL 阿尔法广场 阿尔法广场总店
BET_PL 贝塔广场 Beta Place 总店

目标是实现以下目标:

 "OrgNames": [
                {
                    "value": {
                        "OrgName": [
                            {
                                "value": "AL_PL"
                            }
                        ],
                        "OrgNameType": [
                            {
                                "value": "NameType1"
                            }
                        ]
                    }
                },
                {
                    "value": {
                        "OrgName": [
                            {
                                "value": "Alpha Place"
                            }
                        ],
                        "OrgNameType": [
                            {
                                "value": "NameType2"
                            }
                        ]
                    }
                },
                {
                    "value": {
                        "OrgName": [
                            {
                                "value": "Alpha Place Main Store"
                            }
                        ],
                        "OrgNameType": [
                            {
                                "value": "NameType3"
                            }
                        ]
                    }
                }
            ],

我已经创建了 CTE

org_ali AS (
SELECT tablespaceID
        ,DEPARTMENTID
        ,(object_construct_keep_null(
            'OrgName', array_agg(object_construct_keep_null(
            'value', src.NameType1
            )
            ),
            'OrgNameType', array_agg(object_construct_keep_null(
             'value', 'NameType1'
            )
            )
        )
        ) AS AliasName                  
FROM TABLE AS src
        GROUP BY tablespaceID,
        DEPARTMENTID,
        NameType1

并且在后来的 CTE 中添加了(带有适当的连接)

,
                'OrgNames',array_agg(object_construct_keep_null('value', org_ali.AliasName)
                ),

当只需要一个结果时,这非常有效。但是,我需要在同一命名结构下复制具有不同数据的值键对。

我似乎无法在不与其中一个键发生冲突的情况下构建它。 Snowflake 的约束是结构体中不超过 1 个参数。

显然,我缺少一些东西。任何帮助都会很棒。谢谢你。

snowflake-cloud-data-platform key-value array-agg object-construction
1个回答
0
投票

我已经得到了代码,并且效果很好(在 Snowflake 中测试)。只需使用 LISTAGG 函数即可实现。

    SELECT
  PARSE_JSON(
    '[' ||
      LISTAGG(
        '{
          "value": {
            "OrgName": [{"value": "' || column_value || '"}],
            "OrgNameType": [{"value": "' || column_name || '"}]
          }
        }',
        ', '
      )
      WITHIN GROUP (ORDER BY column_index) ||
    ']'
  )::VARIANT AS OrgNames
FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS column_index,
    column_name,
    column_value
  FROM --ENTER YOUR TABLE NAME HERE
  UNPIVOT (column_value FOR column_name IN (NameType1, NameType2, NameType3))
);
© www.soinside.com 2019 - 2024. All rights reserved.