Postgresql以存储在表中的类型返回变量

Posted

技术标签:

【中文标题】Postgresql以存储在表中的类型返回变量【英文标题】:Postgresql return variable in type stored in a table 【发布时间】:2017-04-26 16:27:34 【问题描述】:

我目前正在开发一个应用程序,但在尝试对使用自定义类型的表创建查询时遇到了问题。

这是一个示例表和类型,

CREATE TYPE address AS (
  street varchar(40),
  city   varchar(25),
  zip    varchar(5)
);
CREATE TABLE houses (
  id SERIAL PRIMARY KEY,
  address address
);

我需要检索一个列表,其中包含存储在表格房屋中的所有城市。 这是我尝试做的:

SELECT address.city
FROM houses
GROUP BY address.city

它将 address.city 检测为表。有什么方法可以在 PostgreSQL 中做我想做的事吗?

【问题讨论】:

【参考方案1】:

我不会在表格中使用这样的复合类型。但是你仍然可以这样做,使用括号。

SELECT (address).city
FROM houses
GROUP BY (address).city

来自the docs

要访问复合列的字段,需要写入一个点和字段名称,就像从表名称中选择一个字段一样。 事实上,这非常类似于从表名中进行选择,您经常必须使用括号来避免混淆解析器。

相反,我会使用jsonb。或者,如果您要使用复合类型,则应使用 PostGIS 中的 stdaddr

【讨论】:

我不建议用 json 代替规范化。 无论哪种方式都没有标准化。 我很好奇为什么 jsonb 比复合类型更受欢迎。是否有性能方面的考虑? @HaleemurAli 有几个,他们双向切割。自定义类型没有要点索引。该练习留给实施者,因此您仅限于 btree 或手动索引子类型。

以上是关于Postgresql以存储在表中的类型返回变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PostgreSQL(timescaledb) 在表中花费更多的存储空间?

PostgreSQL 数据类型

如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句

在java中存储PostgreSQL/PostGIS“几何(多多边形)”数据类型

Redshift - 问题在存储在表中的表中显示时差

Excel - 在表中查找值以返回第 n 列值