Snowflake 中的 object_delete 键中的转义冒号 (`:`)

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

我有一个变体类型,其中包含一个名称中带有冒号

:
的键,有时会嵌套
{"object":{"department:custom": "value}}
。我想从变体中删除这些键(使用
object_delete
)。我该怎么做?

输入:

select 
OBJECT_CONSTRUCT('object', OBJECT_CONSTRUCT('team_name:custom', 'some_value', 'key', 'value')) 
as examples from dual
union all
select 
OBJECT_CONSTRUCT('team_name:custom', OBJECT_CONSTRUCT('team_name:key', 'some_value'), 'object', OBJECT_CONSTRUCT('key', 'value')) 
as examples from dual;

所需输出:

EXAMPLES
{   "object": {     "key": "value"   } }
{   "object": {     "key": "value"   } }

编辑: 我想保留多个键/值对,并且要保留的键的数量各不相同并且事先无法得知。众所周知,所有包含

:
的键(及其子键)都可以安全删除。

sql snowflake-cloud-data-platform variant
1个回答
0
投票

您将无法使用

remove_object
执行此操作,尤其是当您想以递归方式运行此操作时。

JS UDF 的替代方案:

create or replace function remove_colonned_keys(X variant)
returns variant
language javascript
as
$$
function remove_colonned_keys(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }

    if (Array.isArray(obj)) {
        return obj.map(item => remove_colonned_keys(item));
    }

    const newObj = {};

    for (const key in obj) {
        if (obj.hasOwnProperty(key) && !key.includes(':')) {
            newObj[key] = remove_colonned_keys(obj[key]);
        }
    }

    return newObj;
}

例如:

return remove_colonned_keys(X);
$$;

with data as (
    select 
    OBJECT_CONSTRUCT('object', OBJECT_CONSTRUCT('team_name:custom', 'some_value', 'key', 'value')) 
    as e from dual
    union all
    select 
    OBJECT_CONSTRUCT('team_name:custom', OBJECT_CONSTRUCT('team_name:key', 'some_value'), 'object', OBJECT_CONSTRUCT('key', 'value')) 
    as examples from dual
)

select *, remove_colonned_keys(e)
from data

© www.soinside.com 2019 - 2024. All rights reserved.