2010-05-31 55 views
0

我有一個需要構建sql查詢的場景。我試圖想出一個有效的查詢,但找不到明確的方法。我的情況如下:需要幫助來構建PL/SQL查詢

我有TABLE_A和TABLE_B,其中FIELD_AB肯定是TABLE_A的一個字段,但是,TABLE_B中可以存在FIELD_AB。

我需要從TABLE_B中檢索FIELD_AB的值(如果此字段存在),如果不存在,則從TABLE_A中檢索FIELD_AB的值。

我正在尋找一個單一的查詢來檢索FIELD_AB的值,並根據我的知識CASE語句可用於完成此操作,但不清楚使用它的更好方法。

編輯:

請不要誤解的問題。我的意思是「FIELD_AB可以存在」什麼是有本身並不在表-B存在FIELD_AB的可能性,而不是一個值FIELD_AB 任何幫助表示讚賞

謝謝

+0

編輯 - 不清楚爲什麼你將它標記爲[plsql]它可以在純SQL中完成。 – APC 2010-05-31 17:05:43

回答

1

您可能需要使用一個外部連接來連接這兩個表:

select a.id 
     , case when b.col_ab is null then a.col_ab 
       else b.col_ab end as ab 
from table_b b 
    left outer join table_a a 
    on (b.id = a.id) 
/

Oracle有一些測試NULL的替代方法。 AB更簡單的測試方法是:

nvl2(b.col_ab, b.col_ab, a.col_ab) as ab 

這在邏輯上與更詳細的CASE()語句相同。

+0

我們可以使用NULL檢查來確定Field本身是否不存在? (不是字段的值) – nimo 2010-05-31 17:26:55

+0

'b.id爲空時的情況....'將測試table_b中的行是否被找到,與table_b.field_ab(col_ab,whatever ...)是否爲null無關或不。所以 – araqnid 2010-05-31 17:40:08

0
create table table_b (field_ab int not null, value varchar(20) not null) 

create table table_a (field_ab int not null, value varchar(20) not null) 

insert into table_a values(1, '1 from a') 
insert into table_a values(2, '2 from a') 
insert into table_a values(3, '3 from a') 

insert into table_b values(2, '2 from b') 

-- result is '2 from b' 
select 
    case when b.field_ab is null then a.value 
    else b.value 
    end 
from table_a a left outer join table_b b on a.field_ab = b.field_ab 
where a.field_ab = 2 

-- result is '1 from a' 
select 
    case when b.field_ab is null then a.value 
    else b.value 
    end 
from table_a a left outer join table_b b on a.field_ab = b.field_ab 
where a.field_ab = 1