如何遍历 DuckDB / SQL 数据字典中的嵌套数据(STRUCT)?

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

在 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

上下文:编写一些模式跟踪工具。

sql postgresql duckdb data-dictionary
1个回答
0
投票

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)]                                              │
└───────────────────────────────────────────────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.