2017-07-27 2 views
0

Ich habe einen Anwendungsfall für die Durchführung einer Abfrage für mehrere optionale Parameter. Einige Parameter können während der Abfrageausführung übergeben werden.Oracle SQL Query optionale Parameter Leistung

Bis jetzt habe ich zwei verschiedene Lösungen gefunden. Ich brauche Hilfe, um herauszufinden, welche Leistung besser ist? Oder gibt es eine andere alternative Lösung?

user_passed_variable IS NULL OR SOME_COLUMN = user_passed_variable 

NVL(SOME_COLUMN, ’null’) = NVL(user_passed_variable, NVL(SOME_COLUMN, ’null’)) 

Hinweis: Die Säule kann auch Nullwerte halten.

+0

Nicht genug Details hier, aber das Anwenden einer Funktion auf eine Tabellenspalte, wie NVL (SOME_COLUMN), kann den Optimierer einschränken. In diesem Fall können Sie einen funktionsbasierten Index erstellen. Da wir nicht wissen, dass Ihre Tabelle wie folgt aussieht und welche Indizes Sie usw. haben, können Sie keine große Hilfe bieten. – OldProgrammer

+0

Wenn zwei Bedingungen durch 'ODER' getrennt sind, wird die Verwendung eines Indexes für 'SOME_COLUMN' verhindert. So wird die Funktion aufrufen (und es ist nicht klar, wie ein funktionsbasierter Index helfen würde, da NVL (SOME_COLUMN, 'null') 'auch in einem anderen 'NVL()' Aufruf enthalten ist). Möglicherweise gibt es Lösungen, die die Verwendung eines Index ermöglichen. 'Select * from EMP wo null UNION ALL select * from EMP wo ANGNR = ' – mathguy

+0

In diesem Beispiel: Zum Beispiel, wenn ich von 'EMP' wo' ANGNR = 'oder' ist NULL' Zeilen ausgewählt wollte Wenn die Benutzereingabe "NULL" ist, ruft das erste Mitglied von "UNION ALL" alles ab, während das zweite Mitglied sofort als leer erkannt wird. Wenn die Eingabe nicht "NULL" ist, wird das erste Mitglied sofort als leer erkannt, und das zweite Mitglied kann einen Index für "EMPNO" ausnutzen. – mathguy

Antwort

0

Normalerweise ich folgendes tun:

SELECT * FROM MY_TABLE WHERE SOME_COLUMN = NVL(user_passed_variable,SOME_COLUMN); 

Wenn die user_passed_variable NULL ist, ruft es alle Zeilen und wenn user_passed_variable gesetzt ist, wird nur die gegebene Zeile mit dem Index

Works holen, wenn Ihr

0

Die Filterabfrage sollte in der Weise funktionieren, dass, wenn der Benutzer den optionalen Wert zur Verfügung stellt, es zu einem Filter hinzugefügt wird, andernfalls nicht zum Filter hinzufügen, so dass die Abfrage nur prüfen soll Benutzer übergebenen Werte mit dem db passen Werte

Select * from Filter_table where 
(user_passed_value1 is null or column1 = user_passed_value1) and 
(user_passed_value2 is null or column2 = user_passed_value2) 

so diese Art der Abfrage verwenden Sie die Tabelle suchen auf der Basis der vom Benutzer gegebenen Eingabe.