在 DuckDB 中,如何使用
STRUCT
或 INFORMATION_SCHEMA
模式函数遍历嵌套结构 (duckdb_*
)? 我还想识别数组类型。 如果解决方案可以移植到 Postgresql 那就太好了。
例如桌子
CREATE TABLE t(x BIGINT, y STRUCT(a BIGINT, b TEXT), z TEXT[]);
将生成如下所示的数据结构。
x BIGINT
y STRUCT
y.a BIGINT
y.b TEXT
z ARRAY-TEXT
上下文:编写一些模式跟踪工具。
describe t
是一个起点:
D CREATE OR REPLACE TABLE t(x BIGINT, y STRUCT(a BIGINT, b TEXT), z TEXT[]);
D select column_name, column_type from (describe t);
┌─────────────┬─────────────────────────────┐
│ column_name │ column_type │
│ varchar │ varchar │
├─────────────┼─────────────────────────────┤
│ x │ BIGINT │
│ y │ STRUCT(a BIGINT, b VARCHAR) │
│ z │ VARCHAR[] │
└─────────────┴─────────────────────────────┘
以编程方式遍历结构体的一种方法是将其转换为 JSON。 例如考虑:
D insert into t values (1, {'a': 1, 'b': 'x'}, ['ab']);
D select list_transform(json_keys(j), x -> (x, j ->> x))
from (select y::JSON as j from t);
┌───────────────────────────────────────────────────────────────┐
│ list_transform(json_keys(j), (x -> main."row"(x, (j ->> x)))) │
│ struct(varchar, varchar)[] │
├───────────────────────────────────────────────────────────────┤
│ [(a, 1), (b, x)] │
└───────────────────────────────────────────────────────────────┘