2016-06-24 3 views
0

Was Oracle-Abfrage sein sollte, um drei verschiedene Spaltenwert aus einer einzelnen Zeile zu drei verschiedenen Zeilen in einer Spalte zusammen mit einer Spalte on-fly und Ergebnis sollte keinen Nullwert in Spalte enthaltenOrakelabfrage, um verschiedene Spalten in eine Spalte zu füllen

Tabelle: Telecom
id --- --- Anbieter Verbraucher --- Empfänger
1 ---- ---- vodaphone t-mobile ----- AT & T

erwartet wird
id ----- ---- Name Typ
1 ---- ---- vodaphone Anbieter
1 ---- t-mobile ---- Verbraucher
1 ---- AT & T -------- reciever

Antwort

0

Eine einfache Art und Weise verwendet union all:

select id, provider as name, 'provider' from telecom union all 
select id, consumer, 'consumer' from telecom union all 
select id, receiver, 'receiver' from telecom ; 

Dies wird telecom dreimal scannen. Eine effizientere Methode könnte sein:

select t.id, 
     (case which when 'provider' then provider 
        when 'consumer' then consumer 
        when 'receiver' then receiver 
     end) as name, 
     which     
from telecom t cross join 
    (select 'provider' as which from dual union all 
     select 'consumer' as which from dual union all 
     select 'receiver' as which from dual 
    ) x 
0

Oracle-Setup:

SET DEFINE OFF; 

CREATE TABLE Telecom (id, provider, consumer, receiver) AS 
SELECT 1, 'vodaphone', 't-mobile', 'AT&T' FROM DUAL; 

Abfrage:

SELECT id, 
     name, 
     "type" 
FROM telecom 
UNPIVOT(name FOR "type" IN (provider, consumer, receiver)); 

Ausgang:

 ID NAME  type 
---------- --------- -------- 
     1 vodaphone PROVIDER 
     1 t-mobile CONSUMER 
     1 AT&T  RECEIVER 

aktualisieren:

SET DEFINE OFF; 

CREATE TABLE Telecom (id, col_provider, col_consumer, col_receiver) AS 
SELECT 1, 'vodaphone', 't-mobile', 'AT&T' FROM DUAL UNION ALL 
SELECT 1, 't-mobile', NULL, 'EE' FROM DUAL; 

Abfrage:

SELECT id, 
     name, 
     "type" 
FROM telecom 
UNPIVOT(name FOR "type" IN (col_provider AS 'provider', 
           col_consumer AS 'consumer', 
           col_receiver AS 'receiver')); 

Ausgang:

 ID NAME  type 
---------- --------- -------- 
     1 vodaphone provider 
     1 t-mobile consumer 
     1 AT&T  receiver 
     1 t-mobile provider 
     1 EE  receiver 
+0

würde es ignorieren Zeile für leere Spalte erstellen ?. Was ist, wenn unser Spaltenname für den Typ unterschiedlich ist, z. B. COL_Provider, COL_Consumer, COL_RECEIVER, aber wie oben angegeben eingegeben werden soll – Nishant

+0

@Nishant Siehe update. – MT0

Verwandte Themen