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.
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
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
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