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
我正在使用 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