2017-10-19 43 views
0

J'utilise Oracle 11g et j'ai une simple requête (rapport) utilisant des paramètres dans ma clause WHERE, mais je ne peux pas utiliser efficacement l'opération OU.SQL - Utiliser l'opérateur OU dans le paramètre

Ma clause WHERE est:

WHERE 
1=1 
AND 
(
    TRUNC(SYSDATE) - TRUNC(seg.START) BETWEEN 0 AND [DaysBeforClass] 
    OR 
    TRUNC(seg.END) - TRUNC(SYSDATE) BETWEEN 0 AND [DaysAfterClass] 
) 


S'il vous plaît, notez que:

  • seg.START et seg.END sont Date Heure Type
  • [DaysBeforClass] et [DaysAfterClass] sont le paramètre à l'utilisateur final (zone de texte)

Ce dont j'ai besoin, c'est que l'utilisateur utilise les deux paramètres simultanément et individuellement.

Actuellement, cette clause WHERE fonctionne bien lorsque:

  • l'utilisateur utilise les deux paramètres simultanément
  • l'utilisateur utilise uniquement le paramètre DaysBeforClass

Toutes les idées?

Merci pour votre aide!

+1

Passez-vous 'NULL' pour un utilisateur qui n'a rien saisi? –

Répondre

0

Peut-être que vous êtes à la recherche d'une condition comme ceci:

WHERE 
    ([DaysBeforClass] IS NULL OR TRUNC(seg.START) BETWEEN TRUNC(SYSDATE) - [DaysBeforClass] AND TRUNC(SYSDATE)) 
    AND 
    ([DaysAfterClass] IS NULL OR TRUNC(seg.END) BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + [DaysAfterClass]) 

J'utilise TRUNC(seg.START) BETWEEN TRUNC(SYSDATE) - [DaysBeforClass] AND TRUNC(SYSDATE) au lieu de TRUNC(SYSDATE) - TRUNC(seg.START) BETWEEN 0 AND [DaysBeforClass] car alors Oracle peut utiliser un indice basé sur les fonctions sur TRUNC(seg.START)

0

Si vous utilisez TRUNC(column_name) puis Oracle ne peut pas utiliser un index sur cette colonne (et devrait avoir un index basé sur la fonction à la place). Vous pouvez également utiliser:

WHERE ( :DaysBeforClass IS NULL 
     OR ( seg.START >= TRUNC(SYSDATE) - :DaysBeforClass 
     AND seg.START < TRUNC(SYSDATE) + 1 
     ) 
    ) 
AND ( :DaysAfterClass IS NULL 
     OR ( seg.END >= TRUNC(SYSDATE) 
     AND seg.END < TRUNC(SYSDATE) + :DaysAfterClass + 1 
     ) 
    ) 
+0

Je suppose que la question est plus liée à "Comment le gérer si' DaysBeforClass' et/ou 'DaysAfterClass' est NULL?" –

+0

@WernfriedDomscheit Je venais de mettre à jour ça. – MT0