Clause SQL where utilise MAX Date d'entrée en vigueur et les valeurs NULL

Je suis en utilisant une interface logiciel pour exécuter SQL sur Oracle. J'ai besoin de récupérer la dernière ligne basé sur la date d'entrée en vigueur.

Voici un exemple de tableau

Table "ACCOUNTS"
Application | Sub_category | Account_Reference | Effective_date
BC_ONLINE   | F            | ABC1234           | 01-JAN-13
BC_ONLINE   | B            | ABC2345           | 01-JAN-13
TE_Notice   | (NULL)       | 1234ABC           | 01-JAN-13
TE_Notice   | (NULL)       | 9876DEF           | 01-APR-13

Le logiciel va passer deux paramètres: l'Application et Sub_category, si j'ai utilisé le code SQL suivant, sur la Demande suivante: BC_ONLINE et Sub_category: F

select a.Account_Reference
from   ACCOUNTS a
where  a.Application = 'BC_ONLINE'
and    a.Sub_category = 'F'
and    a.Effective_date = (select max(b.Effective_date)
                           from   ACCOUNTS b
                           where  b.Effective_date <= sysdate
                           and    b.Application = a.Application
                           and    b.Sub_category = a.Sub_category)

MAIS dois-je utiliser l'Application suivante: TE_Notice et Sub_category: NULL
et vous ne pouvez pas avoir ce

and    a.Sub_category = null

car il doit être

and    a.Sub_category is null

le problème est que le logiciel est fixe, alors quel est le meilleur moyen d'utiliser à la fois la valeur et la valeur null dans la clause where à l'aide de max(effective_date)?

J'ai essayé cette méthode, mais il ne fonctionne pas

select a.Account_Reference
from   ACCOUNTS a
where  a.Application = 'TE_Notice'
and    (a.Sub_category = '' or a.Sub_category is null)
and    a.Effective_date = (select max(b.Effective_date)
                           from   ACCOUNTS b
                           where  b.Effective_date <= sysdate
                           and    b.Application = a.Application
                           and    NVL(b.Sub_category,-1) = NVL(a.Sub_category,-1))

Il simplement retourné la ligne avec 01-AVR-13, mais je devrais être en train de la ligne avec la Effective_date sur 01-JAN-13.

  • Votre question me donne 1234ABC, qui est le 01-JAN-13 compte de référence, donc pas sûr de ce que le problème est. Cependant, je pense que la quatrième ligne devrait être and (a.Sub_category = '' or ('' is null and a.Sub_category is null)) bien comparer - sinon, si vous passez une valeur non nulle, il va toujours correspondre à des valeurs nulles dans les données.
  • Maintenant, je sais où j'allais mal - j'ai raté le <= sysdate! mais @AlexPoole, vous avez raison, la quatrième ligne de l'amélioration est nécessaire. J'ai été préoccupé par ce, ne savait pas comment le meilleure expression de cette ligne. L'apprécier.
  • Quel est le résultat attendu? Une seule ligne avec max date ou plus...?
  • Le résultat attendu est une seule ligne avec le max de date <= sysdate.
InformationsquelleAutor Joshua | 2013-02-22