如何在Postgres中创建用户定义的基类型并在以后继承以创建另一个用户定义的类型



我正在尝试将查询从oracle转换为postgres。oracle函数中有一个TREAT,它将输入expr转换为声明类型(https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/TREAT.html#GUID-037C0CD3-C556-4A02-80E0-C6F15147C5BF(,我正试图找到与该函数对应的类似查询。因此,我在我链接的文档中尝试了示例查询。为了看到这个例子的结果,我不得不制作这样的新数据类型。

CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER) NOT FINAL;
CREATE TYPE employee_t UNDER person_t(department_id NUMBER, salary NUMBER) NOT FINAL;

然后在表中插入一些数据。

INSERT INTO persons VALUES (person_t('Bob', 1234));
INSERT INTO persons VALUES (employee_t('Joe', 32456, 12, 100000));
INSERT INTO persons VALUES (
part_time_emp_t('Tim', 5678, 13, 1000, 20));

当然,我之前创建了表人物,并使用了treat函数。

SELECT name, TREAT(VALUE(p) AS employee_t).salary salary 
FROM persons p;

这显示了这一结果。

我很好奇我是否可以在postgres中做同样的事情或类似的事情,因为我试图从oracle到postgres进行尽可能相同的查询。

我知道postgres也有create-type子句,但有没有一种方法可以像oracle create-type一样将类型创建为基类型。。。不是决赛吗?如果没有,有办法做这个孩子的事吗?

在PostgreSQL中没有与类型子类化直接等价的东西。有相关功能:

  • TREAT看起来像CAST。我真的看不出类型演员有什么区别。

  • 存在表继承。

然而,您将从使用非标准特性中获得好处:您将不得不重写。我建议一般不要使用用户定义的类型。让您的persons表具有每个可能的子类型的所有属性,并添加一个person_type列。

最新更新