如何检查雪花中的空JSON

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

我在雪花表的变体列(有效负载)中有如下 json。

{
    "Input1": {
        "address": "",
        "phone": "123-345-6789",
        "city": "",
        "class": "",
        "name": "test",
        "no_call": true,
        "state": "",
        "zip": ""
    },
    "Input2": {    
        "person": {}
    }
}

当我的 person dict 在 input2 中为空时,我需要获取 input1 值并构造我的新 json 对象。我正在编写如下代码。

代码片段:

query="""
select case when payload:Input2:person::variant !='{}'
then construct my object with Input2 values
else construct my object with Input1 values end as person_details from {sf_schema}.{sf_table}
""".format_map(conn_dict)
cs.execute(query);

这是我在雪花中执行查询的Python代码。但我收到此错误:

值错误:格式字符串包含位置字段

我的

conn_dict
的值为
sf_schema
sf_table
。问题就出在这个声明上。它正在将 {} 视为位置参数,因为我正在检查它是否为空字典。

payload:Input2:person::variant !='{}'

我尝试逃离角色,但没有成功。您能帮我们解决这个问题吗?

python snowflake-cloud-data-platform
2个回答
2
投票

不确定Python代码,但在Snowflake SQL中你可以检查第二个人是否是一个空对象,如下所示:

create or replace table t1 as select parse_json($$
{
    "Input1": {
        "address": "",
        "phone": "123-345-6789",
        "city": "",
        "class": "",
        "name": "test",
        "no_call": true,
        "state": "",
        "zip": ""
    },
    "Input2": {    
        "person": {}
    }
}$$) as v;

select v:Input2:person = parse_json('{}') as PERSON_MISSING from t1;

实际上,看起来就像是字符串化来比较,所以甚至没有必要使用

parse_json
。如果 Python 代码被单引号挂起,您可以尝试使用备用字符串终止符,如下所示:

select v:Input2:person = $${}$$ as PERSON_2_MISSING from t1;

1
投票

基于@Greg Pavlik示例数据集,您还可以通过将其与空

object_construct()
进行比较来检查是否存在空对象。

select 
    v:Input2:person = parse_json('{}') as person_missing,
    v:Input2:person = object_construct() as person_missing_too
from t1;
© www.soinside.com 2019 - 2024. All rights reserved.