1

从数据库系统概念中,对于对象关系数据库的 SQL 命令:

create type Publisher as
(name varchar(20),
branch varchar(20));

create type Book as
(title varchar(20),
author array varchar(20) array [10],
pub date date,
publisher Publisher,
keyword set varchar(20) multiset);

insert into books
values (’Compilers’, array[’Smith’, ’Jones’],
new Publisher(’McGraw-Hill’, ’New York’),
multiset[’parsing’, ’analysis’]);

create table flat_Book as
(title varchar(20),
author array varchar(20) array [10],
pub_name varchar(20),
pub_branch varchar(20));

select title, author, Publisher(pub_name, pub_branch) as publisher
from flat_books
group by title, author, publisher;

Publisher(pub_name, pub_branch)里面是什么Publisher()

Publisher()似乎不是Publisher类型的构造方法,因为对构造方法的调用需要new,例如new Publisher(’McGraw-Hill’, ’New York’).

我猜 PostgreSQL 可能有类似的命令,因为它很好地遵循 SQL 标准并且也是对象关系 DBMS。

谢谢。

4

1 回答 1

2

正如Laurenz Albe在他对昨天类似问题的回答中提到的那样,在幕后create table T隐含地创建了一个与表格具有相同结构的复合类型。create type T

然后我们看一下精美手册中的类型转换

类型转换指定从一种数据类型到另一种数据类型的转换。PostgreSQL 接受两种等效的类型转换语法:

CAST ( expression AS type )
expression::type

[...]

也可以使用类似函数的语法来指定类型转换:

typename ( expression )

和:

笔记

类函数语法实际上只是一个函数调用。当使用两种标准转换语法之一进行运行时转换时,它将在内部调用已注册的函数来执行转换。按照惯例,这些转换函数与其输出类型具有相同的名称,因此“类函数语法”只不过是对底层转换函数的直接调用。

把它放在一起:

  • create table publisher也做了一个create type publisher
  • 对于给定的类型TT(expr)是类型转换。
  • 所以publisher(a, b)本质上是使用底层类型转换函数的类型转换。

查看文档的复合类型部分也会有所帮助。

于 2018-07-20T04:37:48.060 回答