我有一个变体类型,其中包含一个名称中带有冒号
:
的键,有时会嵌套 {"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" } }
编辑: 我想保留多个键/值对,并且要保留的键的数量各不相同并且事先无法得知。众所周知,所有包含
:
的键(及其子键)都可以安全删除。
您将无法使用
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