2016-05-13 158 views
-1

的情況我有一個表格式的列:列的行與甲骨文

EmpNumber,PreferredPhoneType,MobilePhone,WorkPhone,HomePhone 
10041,Work Phone,,342423, 

我試圖使用方法:

select empnumber,  
DECODE(PreferredPhoneType,'Work Phone', 'W', 
        'Mobile', 'M', 
        'Home','H') result, 
     MobilePhone,WorkPhone,HomePhone from xx_phone; 

但是,這是獲取所有的值不管列類型。我希望結果是這樣的,如果電話類型是'W',第三列應該帶有工作電話號碼。

  • 如果手機類型的「M」它應是手機號碼和
  • 如果手機類型「H」,它應是家庭電話號碼。

喜歡的東西:

EmpNumber,PhoneType,Number 
    1000  M   336363 
    2828  W   88373 
    3838  H   837373 

有一個函數來做到這一點?

回答

2

這是CASE表達式的典型應用。

我創建了一些輸入數據,顯示了不同的可能情況。我還創建了一個小表,顯示每個描述使用哪個單字母代碼。如果你已經有了這些表,你不需要「WITH條款」頂部,距離select id.empnumber....

with input_data (empnumber, preferredphonetype, mobilephone, workphone, homephone) as (
     select  10041, 'Work Phone'  , null  , '342423' , null  from dual union all 
     select  10043, 'Mobile Phone' , '332211' , '443341' , '288300' from dual union all 
     select  10034, null    , '330403' , '588923' , '455433' from dual union all 
     select  10046, 'Home Phone'  , '433223' , '048423' , null  from dual 
    ), 
    phone_types (phonetype, description) as (
     select   'M', 'Mobile Phone' from dual union all 
     select   'W', 'Work Phone' from dual union all 
     select   'H', 'Home Phone' from dual 
    ) 
select id.empnumber, pt.phonetype, 
     case id.preferredphonetype 
      when 'Mobile Phone' then mobilephone 
      when 'Work Phone' then workphone 
      when 'Home Phone' then homephone 
      end as phonenumber 
from input_data id left outer join phone_types pt 
        on id.preferredphonetype = pt.description; 

EMPNUMBER PHONETYPE PHONENUMBER 
---------- --------- ----------- 
    10043 M   332211 
    10041 W   342423 
    10046 H 
    10034 

注意如何10046具有如首選「家庭電話」開始,但她沒有表中的家庭電話號碼;並且10034具有全部三個電話號碼,但沒有首選電話類型,因此此員工的BOTH值留空(空)。