我在雪花表的变体列(有效负载)中有如下 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 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;
基于@Greg Pavlik示例数据集,您还可以通过将其与空
object_construct()
进行比较来检查是否存在空对象。
select
v:Input2:person = parse_json('{}') as person_missing,
v:Input2:person = object_construct() as person_missing_too
from t1;