SQL - Select 实例类型

SQL - Select instance type

我正在使用 Oracle DB,我有这种类型:

CREATE TYPE t_foo AS OBJECT
(a VARCHAR2(20))
NOT FINAL;

还有这些亚型

CREATE TYPE t_foo1 UNDER t_foo() NOT FINAL;
CREATE TYPE t_foo2 UNDER t_foo() NOT FINAL;

我有一个类型为 t_foo 的 table,我还可以在其中存储 t_foo

的子类型
CREATE TABLE foo OF t_foo;

现在我的问题是如何进行这样的查询

SELECT a, type FROM foo;

并像这样获取每一行的实例类型:

__________________
| a   | type     |
__________________
| bla | t_foo1   |
| ble | t_foo2   |
| bli | t_foo1   |
SQL> insert into foo values(t_foo1('alpha'));
1 row inserted.

SQL> insert into foo values(t_foo2('bravo'));
1 row inserted.

SQL> insert into foo values(t_foo('charlie'));
1 row inserted.

SQL> commit;
Commit complete.

SQL> select
  f.a,
  ut.type_name as type_name
from foo f
  join user_types ut
    on ut.typeid = sys_typeid(value(f));

A                    TYPE_NAME
-------------------- ----------
alpha                T_FOO1    
bravo                T_FOO2    
charlie              T_FOO     

这是我找到的解决方案。

它不是通用的,但如果您的已知类型数量有限,它是一个非常简单的查询。

SELECT f.a,
    CASE WHEN f IS OF (t_foo1) THEN 't_foo1'
         WHEN f IS OF (t_foo2) THEN 't_foo2'
         ELSE 'other' END as type
FROM foo f