Inline-Tabelle in Oracle SQL
Ich versuche zu integrieren, mit einigen software (die ich nicht ändern kann), der eine Datenbank abfragt, die ich ändern kann.
Kann ich Ihnen diese software SQL-Abfragen, wie "select username, firstname, lastname from users where username ?"
Die software füllt die ? mit so etwas wie ('alice', 'bob'), und wird der Benutzer Informationen für Sie.
Sache ist, es ist ein weiteres Stück software, das ich wieder nicht ändern können, die gelegentlich erzeugt der Anwender, wie 'user2343290" und füttert Sie durch, um das erste Stück software. Natürlich, es wirft Fehler, weil Sie nicht finden können, dass Benutzer.
Also die Abfrage, die ich ausführen möchten ist so etwas wie dieses:
select username, firstname, lastname from users where username in ?
UNION ALL
select t.column1, 'Unknown', 'Unknown' from create_table(?) t
wo create_table generiert eine Tabelle mit den Zeilen erwähnt ?, mit der ersten Spalte namens "column1".
Alternativ:
select username, firstname, lastname from users where username in ?
UNION ALL
select t.column1, 'Unknown', 'Unknown' from _universe_ t where t.column1 in ?
wo _universe_
ist eine falsche Tabelle, die enthält jeden Wert in Spalte 1 (also unendlich groß).
Habe ich versucht, Sie ein ? von dual, aber leider funktionierte nur, wenn ? war so etwas wie ('x'), nicht ('x', 'y').
Halten Sie im Verstand, ich kann nicht das format ändern wie ? heraus kommt, so kann ich das nicht select 'alice' from dual union all select 'bob' from dual
.
Jemand weiß, wie ich tun konnte, was ich erwähnt habe, oder etwas anderes, um eine ähnliche Wirkung haben?
InformationsquelleAutor Clinton | 2011-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie durch Trennzeichen getrennte Zeichenfolge von Namen in einer Tabelle geben Sie wie so:
So würden Sie gerade brauchen, um das geben Sie dann Ihrem Beispiel werden würde:
(Ich gehe davon aus dass der ? wird ersetzt durch einfache text-substitution-weil die IN würde nicht funktionieren, wenn es gemacht wurde, als eine bind-variable -- und dass der ersetzte text beinhaltet Klammern.)
Allerdings bin ich mir nicht sicher, dass das Ergebnis dieser hilfreich sein wird, wenn da eine Liste von guten Benutzernamen gegeben, Sie haben jetzt zwei Ergebniszeilen für jeden Benutzernamen, den man mit den eigentlichen Informationen und die andere mit dem "Unbekannten" Werten.
Einen besseren Weg zu formulieren, der Abfrage kann sein:
Danach sollten Sie eine Zeile pro Benutzername, mit dem die eigentlichen Daten, falls es vorhanden ist, oder der "Unbekannten" Werten, wenn es nicht.
InformationsquelleAutor Dave Costa
Könnte man eine Pipeline-Funktion:
Wenn Sie brauchen, um split-Namen (z.B. 'bob,alice), könnte man eine Funktion akzeptiert eine Zeichenfolge und die Rückgabe einer empname_t, z.B. Tom Kyte ist in_list, siehe
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:210612357425
und ändern Sie die to_list Funktion zum Durchlaufen der collection und Rohr jedes Element aus der collection.
InformationsquelleAutor Frank Schmitt