2017-03-19 50 views
1

我使用Oracle數據庫和我有這樣的類型:SQL - 選擇實例類型

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的一個表,我還可以存儲亞型的t_foo

CREATE TABLE foo OF t_foo; 

現在我的問題是我怎麼可以這樣做

查詢
SELECT a, type FROM foo; 

,並得到各行的像部份實例類型:

__________________ 
| a | type  | 
__________________ 
| bla | t_foo1 | 
| ble | t_foo2 | 
| bli | t_foo1 | 

回答

1
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  
0

這是我找到了解決辦法。

這不是一般的,但如果您有一個有限數量的已知類型,這是一個非常簡單的查詢。

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