如何在SnowSQL查询中过滤JSON对象

h6my8fg2  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(77)

我有一个json对象,我想运行一个排除某些键的选择。
例如:
如果我有对象:

"product-list": {
    "product": {
        "commit-timestamp": "2023-01-01T09:19:45.123000Z",
        "operation": "update",
        "partition-key-type": "primary-key",
        "partition-key-value": "12345",
        "record-type": "data",
    }
}

字符串
然后我想选择:

"product": {
    "operation": "update",
    "partition-key-type": "primary-key",
    "partition-key-value": "12345",
    "record-type": "data",
}


在上面的例子中,我排除了 commit-timestamp。请注意,我将为几个不同的json对象执行此操作,因此在没有一个键的情况下简单地重建对象是不可行的。
以下是我目前的查询。

select json[product-list]
from some_table


我尝试过使用json选择器,但这在SnowSQL中不起作用,因为它只支持基本的点和括号表示法。这在Snowflake中可能吗?

h9vpoimq

h9vpoimq1#

您可以使用JavaScript UDF来操作对象。您不能将库添加到Javascript环境中,但基线Javascript包括选择,添加,删除和更改JSON键和值的好方法。

create or replace function transform_json("obj" variant)
returns variant
language javascript strict immutable
as
$$

    obj = obj["product-list"];
    delete obj.product["commit-timestamp"];
    return obj;

$$;

with X as
(
select parse_json($$
{
    "product-list": {
        "product": {
            "commit-timestamp": "2023-01-01T09:19:45.123000Z",
            "operation": "update",
            "partition-key-type": "primary-key",
            "partition-key-value": "12345",
            "record-type": "data"
        }
    }
}
$$) as json
)
select json, transform_json(json) from X
;

字符串
转换输出:

{
  "product": {
    "operation": "update",
    "partition-key-type": "primary-key",
    "partition-key-value": "12345",
    "record-type": "data"
  }
}

相关问题