是否可以抑制Binder错误:无法在duckDB中找到密钥

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

当查询不属于 duckDB 结构的字段时,您会收到以下错误。是否可以抑制此错误并返回 NULL?

当前行为:

SELECT a.b 
FROM 
    (SELECT {'x': 1, 'y': 2, 'z': 3} AS a);

错误:活页夹错误:无法在结构中找到键“b”

候选条目:“x”,“y”,“z”

期望的行为:

SELECT a.b 
FROM 
    (SELECT {'x': 1, 'y': 2, 'z': 3} AS a);
┌───────┐
│   b   │
│ int32 │
├───────┤
│       │
└───────┘
sql struct duckdb
1个回答
0
投票

我遇到了同样的问题。

我找不到真正的“DuckDB 本机”解决方案,但作为解决方法,请考虑创建一个使用 Pythonic

dict.get
函数来实现您正在寻找的内容的 UDF。

可能看起来像:

def _get(d: dict, key: str) -> str | None:
    return d.get(key)

df = pd.DataFrame({'dict_col': [{'a': 'something'}, {'a': 'something else'}]})  # your data here
con = duckdb.connect()
con.register('some_table', df)
con.create_function('udf_get', _get)
result = con.query("select *, udf_get(dict_col, 'a') as a, udf_get(dict_col, 'b') as b from some_table;").fetchdf()
print(result.head())

它将产生以下数据框:

                  dict_col               a     b
0       {'a': 'something'}       something  None
1  {'a': 'something else'}  something else  None

同样,这并不完美,但在我看来是一个合理的解决方法。

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