2010-08-10 9 views
3

J'espère que quelqu'un peut aider à interpréter la dernière ligne de code (Active @ = 1 ....) cette clause SQL:Essayer de comprendre une clause SQL where

SELECT DISTINCT LOC_ID 
    ,LOC_CODE 
    ,ADDR_LINE_1 
    ,ADDR_LINE_2 
    ,ADDR_LINE_3 
    ,CITY 
    ,STATE 
    ,COUNTRY 
    ,POSTAL_CODE 
    ,COMPANY 
    ,OPERATION_TYPE 
    ,PROCESS 
     ,ADDR_LINE_1 + ',' +ADDR_LINE_2+ ',' + CITY + '-' + COUNTRY + ' ' + POSTAL_CODE AS ADDRESS 
     ,COMPANY + '.' + CENTER + '.' + OPERATION_TYPE + '.' + PROCESS AS Proc_Combo 
    ,CASE WHEN INACTIVE_DATE IS NULL THEN 'Active' 
     WHEN INACTIVE_DATE IS NOT NULL THEN 'InActive' 
    ELSE 'UNKNOWN' END AS INACTIVE_DATE 
    ,CASE WHEN INSTANCE_ID = 1 THEN 'AP' 
     WHEN INSTANCE_ID = 2 THEN 'GAP'  
    ELSE 'ALL' END AS INSTANCE_ID 
FROM HR_Locations 
WHERE 
    (@STATE IS NOT NULL AND STATE [email protected] OR @STATE='' AND STATE =STATE OR @STATE IS NULL AND 1=1) 
AND 
    (@ACTIVE=1 AND INACTIVE_DATE IS NULL OR @ACTIVE=2 AND INACTIVE_DATE IS NOT NULL OR @ACTIVE=0 AND 1=1 OR @ACTIVE IS NULL) 

J'ai rencontré un code comme celui-ci, que ce ne figure pas dans un « IF » bloc

+0

Quelle partie ne comprenez-vous pas? –

+5

Wow, et est et ou est mélangés ensemble sans parenthèses. Quel programmeur audacieux. –

+0

@Kirk ... merci d'avoir dit ça. Je pensais que je le perdais. – user279521

Répondre

3

plus facile à comprendre lors d'une nouvelle écrite comme

(@ACTIVE=1 AND INACTIVE_DATE IS NULL) 
OR (@ACTIVE=2 AND INACTIVE_DATE IS NOT NULL) 
OR (@ACTIVE=0 AND 1=1) 
OR @ACTIVE IS NULL 

La partie qui me semble intéressant est (@ACTIVE=0 AND 1=1). Ce sera AND la condition @ACTIVE=0 avec la valeur TRUE. Il me semble que ce pourrait être une faute de frappe. J'ai vu des choses comme (@ACTIVE=0 OR 1=1) pour rendre la condition sorte de "facultatif", mais dans ce cas, il semble inutile. Pouvez-vous essayer d'exécuter leur requête sans AND 1=1 pour voir si les résultats sont les mêmes?

+0

Je vais essayer. – user279521

+0

La requête semble être générée par du code. Dans ce cas, '1 = 1' est un drapeau, si la 'variable' s'écrit '0' alors cette condition n'est pas évaluée: comme elle renvoie false pour toute valeur @active, et est entre les OR, alors la clause where retournera 'vrai' en ne dépendant que des autres conditions. –

+0

les enregistrements retournés sont les mêmes !! – user279521

1

Je ne sais pas ce que le 1 = 1 est pour ...

@ACTIVE=1 AND INACTIVE_DATE IS NULL OR 
@ACTIVE=2 AND INACTIVE_DATE IS NOT NULL OR 
@ACTIVE=0 AND 1=1 OR 
@ACTIVE IS NULL 

Il semble que la clause where est le @Active valider flag et la date inactive pour s'assurer que si le statut est actif alors l'inactif est nul et vice-versa.

+0

seriez-vous d'accord qu'une déclaration IF aurait rendu cela plus facile à lire? (ne pas dénigrer l'auteur original du code, juste vouloir savoir si le garder simple est le chemin à parcourir) – user279521

+0

S'IL VOUS PLAÎT bash l'auteur original du code. C'est terrible :). La technique elle-même n'est pas si mauvaise (vérifiant les états @Active avec des ORs), mais comme écrit, elle est simplement illisible. Nécessite des parenthèses et de préférence espacées entre les lignes (une pour chaque état @actif). – MisterZimbu

+3

@user Il est assez normal d'exprimer ce type de logique dans la clause WHERE plutôt que dans une instruction IF lorsque vous travaillez avec SQL - il aurait été utile pour le développeur d'origine d'utiliser des parenthèses cependant! – Justin