2017-07-27 4 views
0

J'ai un cas d'utilisation pour effectuer une requête sur plusieurs paramètres facultatifs. Quelques paramètres peuvent ou ne peuvent pas être transmis lors de l'exécution de la requête.Performance des paramètres optionnels Oracle SQL Query

Jusqu'à présent, j'ai trouvé deux solutions différentes. J'ai besoin d'aide pour déterminer qui fonctionne le mieux? Ou existe-t-il une autre solution alternative?

user_passed_variable IS NULL OR SOME_COLUMN = user_passed_variable 

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

Remarque: La colonne peut également contenir des valeurs nulles.

+0

Pas assez de détails ici, mais l'application d'une fonction à une colonne de table, comme NVL (SOME_COLUMN) peut limiter l'optimiseur. Dans ce cas, vous pouvez créer un index basé sur une fonction. Puisque nous ne savons pas que votre table ressemble, et quels index vous avez, etc., ne peuvent pas offrir beaucoup d'aide – OldProgrammer

+0

Avoir deux conditions séparées par 'OR' empêchera l'utilisation d'un index sur' SOME_COLUMN'. La fonction appelle aussi (et l'utilité d'un index basé sur les fonctions n'est pas claire, puisque NVL (SOME_COLUMN, 'null') 'est également enterré dans un autre appel' NVL() '). Il peut y avoir des solutions qui permettent l'utilisation d'un index. Par exemple, si je voulais sélectionner des lignes de 'EMP' où' EMPNO = 'ou' est NULL': 'select * de EMP où est nul UNION ALL choisir * EMP où EMPNO = ' – mathguy

+0

Dans cet exemple , si l'entrée de l'utilisateur est 'NULL' alors le premier membre de' UNION ALL' récupère tout alors que le second membre est immédiatement reconnu comme vide. Si l'entrée n'est pas 'NULL', alors le premier membre est immédiatement reconnu vide, et le second membre peut tirer parti d'un index sur' EMPNO'. – mathguy

Répondre

0

Habituellement, je fais ce qui suit:

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

Si le user_passed_variable est NULL, il récupère toutes les lignes et si user_passed_variable est réglé, il va extraire que la ligne donnée en utilisant l'indice

Works si votre SOME_COLUMN n'a pas de valeurs nulles

0

La requête de filtre devrait fonctionner de telle manière que si l'utilisateur fournissait la valeur optionnelle, ajoutez-la à un filtre sinon ne l'ajoutez pas au filtre, donc la requête devrait vérifier seulement si le l'utilisateur des valeurs transmises sont sélectionnés avec la db valeurs

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) 

donc en utilisant ce type de requête que vous recherchez la table en fonction de l'entrée donnée par l'utilisateur.