我有一个雪花表,其中三个不同的列用作名称类型/值。这些需要使用 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 中测试)。只需使用 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))
);