Question

LNNVL est un oracle construit en fonction que les rendements TRUE pour évaluer les conditions de FALSE ou UNKNOWN, et retourne FALSE pour évaluer les conditions à TRUE. Ma question est quel serait le bénéfice de retour à l'opposé de la condition de la vérité plutôt que de manipuler simplement les valeurs NULL?

Par exemple, supposons que vous avez une table Emp avec des colonnes StartCommission et CurrentCommission qui peuvent contenir des valeurs nulles. Les rendements suivants uniquement les lignes avec ni valeur nulle:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission;

Si vous souhaitez inclure les lignes où soit la commission est nulle, vous pouvez faire quelque chose comme ceci:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission 
OR StartCommission IS NULL OR CurrentCommission IS NULL;

Il semblerait comme une fonction existerait pour raccourcir cette syntaxe, mais en utilisant LNNVL renvoie tous les enregistrements non égaux et tous les enregistrements avec les valeurs NULL.

SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);

Ajout de ne pas ce que les lignes retourne sans valeurs nulles. Il me semble que la fonctionnalité souhaitée pour ce cas serait de garder les conditions réelles vraies, fausses conditions fausses, et ont des conditions inconnues à évaluer vrai. Ai-je vraiment créé un cas de faible utilisation ici? Est-il vraiment plus susceptibles de vouloir transformer en véritable inconnu, vrai en faux, et faux en vrai?

create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into emp values (.2,null);
insert into emp values (.3,.4);
Était-ce utile?

La solution

Il est une fonction bizarre avec un bizarre histoire - mais est si NVL2 bizarre. lnnvl est fondamentalement un opérateur is not true - Sans doute, il peut être utilisé à bon escient comme nvl2 peut, mais quand vous devez regarder une fonction à chaque fois que vous utilisez pour vous rappeler exactement ce qu'il fait, il vous reste se demander s'il est préférable de coller à nvl, coalesce, decode et nullif ainsi que des expressions case, plus intuitive

Autres conseils

Mettez cette façon, je ne l'ai pas encore une fois utilisé LNNVL dans mes quelques années d'être un DBA et PL / SQL programmeur. Je l'ai utilisé NVL2 à l'occasion (et avait toujours regarder de quel côté était vrai, et de quel côté était pas). En ce moment-là, il semble préférable du point de vue de la lisibilité pour mettre fin à l'aide NVL, DECODE, CASE, etc.,

Sinon, cela fonctionne, en supposant un a une bonne poignée sur la façon dont les poignées Oracle NULLs et l'arithmétique, mais par ce point, on peut ainsi que l'utilisation de votre requête d'origine pour une meilleure lisibilité (et le plan d'exécution peut prendre un plus fort succès aussi ):

/* Return all rows where StartCommission is the same
 * as Current Commission, or those rows who have a
 * NULL in either (including both)
 */

SELECT *
  FROM Emp
 WHERE StartCommission = CurrentCommission
    OR StartCommission + CurrentCommission IS NULL

-- NULL + NULL, or NULL + Number is always NULL; hence return either
-- those records that are equal, or have a combined total of NULL
-- (either or both fields will be NULL).
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top