2016-05-13 8 views
-1

Ich habe eine Tabelle mit Spalten im Format:Spalten in Zeilen mit einer Bedingung in Oracle

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

ich zu verwenden Ich versuche:

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

Aber das ist es, alle Werte abrufen, unabhängig von der Spaltentyp Ich möchte, dass das Ergebnis so ist, dass, wenn der Telefontyp "W" ist, eine dritte Spalte mit der Arbeitstelefonnummer erzeugt werden sollte.

  • Wenn Telefontyp ‚M‘ soll es als Handy-Nummer und
  • Wenn Telefon-Typ ‚H‘, sollte es als Startseite Telefonnummer.

Etwas wie:

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

Gibt es eine Funktion, dies zu tun?

Antwort

2

Dies ist eine typische Anwendung des CASE-Ausdrucks.

Ich habe einige Eingabedaten erstellt, die verschiedene mögliche Situationen zeigen. Ich habe auch eine kleine Tabelle erstellt, die zeigt, welcher Ein-Buchstaben-Code für jede Beschreibung verwendet wird. Wenn Sie bereits diese Tabellen haben, brauchen Sie nicht die „WITH-Klausel“ an der Spitze, beginnen gerade von 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 

Beachten Sie, wie 10046 „Home Phone“ gezeigt, wie bevorzugt, aber sie hat nicht eine private Telefonnummer in der Tabelle; und 10034 hat alle drei Telefonnummern, aber keinen bevorzugten Telefontyp, daher werden BEIDE Werte für diesen Mitarbeiter leer gelassen (null).