PostgreSQL unnest,嵌套字段特定元素的 WHERE 子句

Posted

技术标签:

【中文标题】PostgreSQL unnest,嵌套字段特定元素的 WHERE 子句【英文标题】:PostgreSQL unnest, WHERE clause on specific element of nested field 【发布时间】:2020-07-16 20:50:51 【问题描述】:

鉴于下表,我想提取 id 值 WHERE 60 显示为 status 的第二个元素。我看到它是一个嵌套字段。其中,我如何获得第二个元素?

╔════╤════════════════════════════════════════════════╗
║ id │ status                                         ║
╠════╪════════════════════════════════════════════════╣
║ 1  │  "(1234,60,\"2020-02-29 01:18:19.309232\")"  ║
╟────┼────────────────────────────────────────────────╢
║ 2  │  "(4567,70,\"2020-02-29 01:18:19.309232\")"  ║
╚════╧════════════════════════════════════════════════╝

结果应该是 id = 1,因为 60 是该行的 status 的第二个元素。

我的同事告诉我值中的不同字段。

    user_id (bigint) status (bigint) updated_at (timestamp)

【问题讨论】:

"我看到它是一个嵌套字段。" - 它的数据类型到底是什么?看起来不像数组,不像 JSON,更像是自定义的字符串格式。 @Bergi 我不确定它是什么类型。它被称为“user_status_t[]”。不确定那是什么类型。 啊,那是一个很大的不同! user_status_t 将是 custom composite type。请向我们展示它在您的架构中的定义。 谢谢!我的同事告诉我价值中的不同领域。 1st - user_id (bigint), 2nd - status (bigint), 3rd - updated_at (timestamp) 使用你给我看的文档,我现在知道如何访问它了。谢谢! 你可能想post your solution as an answer然后 【参考方案1】:

您可以使用. 访问复合类型的各个元素。因此,对您的(非规范化!)表的查询将是

SELECT id
FROM table_name
WHERE (table_name.status).status = 60;

【讨论】:

以上是关于PostgreSQL unnest,嵌套字段特定元素的 WHERE 子句的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery:UNNEST 重复与展平表性能

PostgreSQL unnest 与空数组

对 Google Bigquery 中的嵌套字段使用 OFFSET 而不是 UNNEST

带有 unnest 的嵌套 SQL 评估问题

BigQuery 中的 Unnest 导致“数组”错误

在 BIGQUERY 上使用 UNNEST 左连接