Ich versuche, eine Oracle-Abfrage in Postgres zu konvertieren.
Die Oracle-Abfrage verwendet Folgendes, um dynamische tabellenähnliche Daten zu generieren:
SELECT ROWNUM TYPE_ID, regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) TYPE
FROM DUAL
CONNECT BY regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) IS NOT NULL
Output:
TYPE_ID,TYPE
1,NED
2,SED
3,ZED
4,MED
Betrachten Sie die Beispieltabelle:
create table details(
Title Varchar,
Misc Varchar
);
insert into details values ('DBA','5 years');
Das ist die ganze Abfrage:
select /*ACC DATA*/ (case when ACC.TYPE_ID= 4 then null else
Title end) Job_title,
ACC.* from DUAL,
(SELECT ROWNUM TYPE_ID, regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) TYPE
FROM DUAL
CONNECT BY regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) IS NOT NULL) ACC,
details
Output looks like this:
JOB_TITLE,TYPE_ID,TYPE
DBA,1,NED
DBA,2,SED
DBA,3,ZED
Die Abfrage gibt also jede Zeile der Detailtabelle dreimal zurück, mit TYPE_ID als 1,2,3 und TYPE als NED,SED,ZED.
Wie kann dies in Postgres 11.5 erreicht werden?
Wie Sie festgestellt haben, verfügt Postres nicht über das nützliche "connect by ...". Aber es hat andere ebenso nützliche Funktionen. In diesem Fall: (Siehe Geige )
Beide analysieren die Zeichenfolge in einzelne Elemente. Leider bieten beide keine Enumeration an, jedoch ist sie leicht von der Fensterfunktion row_number zu erhalten. Ihre Oracle-Anweisung wird also (type ist ein reserviertes Wort in Postgres und würde einen Fehler generieren, also wechsle ich zu type_val.)
select row_number() over() type_id,type_val
from (select unnest(string_to_array('NED,SED,ZED,MED',',')) type_val ) sl
Damit ist es ein einfacher Schritt, dies mit Ihrer Detailtabelle zu verbinden, um das zu erhalten, was Sie wollen.
with split_list(type_id,type_val) as
( select row_number() over() type_id,type_val
from (select unnest(string_to_array('NED,SED,ZED,MED',',')) type_val ) sl
)
select title, type_id, type_val
from details
cross join split_list
where type_id != 4;
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen