2016-07-21 1 views
0

ne pouvons-nous avoir cela dans un seul SQL sans utiliser IFCombinant conditions dans une condition IF

IF (@PPRODUCT_TYPE_ID != '0') 
    SELECT * FROM PRODUCT 
    WHERE 
     PRODNAME = @pName 
    AND 
     PRODUCT_TYPE_ID IN (SELECT DISTINCT ID FROM PPRODUCT_TYPE) 
ELSE 
    SELECT * FROM PRODUCT 
    WHERE PRODNAME = @pName 

Répondre

2

Une méthode est:

SELECT p.* 
FROM PRODUCT 
WHERE PRODNAME = @pName AND 
     (@PPRODUCT_TYPE_ID <> '0' AND 
     PRODUCT_TYPE_ID IN (SELECT NUMBER FROM DBO.MAKE_TABLE_USING_COMMASEPERATED_LIST(@PPRODUCT_TYPE_ID)) 
    ) OR 
     ((@PPRODUCT_TYPE_ID = '0' OR @PPRODUCT_TYPE_ID IS NULL); 

Cependant, la version originale pourrait mieux fonctionner, parce que Deux requêtes distinctes et plus simples peuvent être plus faciles à optimiser qu'une grande requête (en particulier lorsque les requêtes utilisent des paramètres).

+0

Votre réponse est parfaite. Un léger changement que je suggère est d'utiliser ISNULL (@ PRODUCT_TYPE_ID, '0') = '0' dans le deuxième OU. – DVT

+0

@DVT votre méthode est correcte, mais ce n'est pas l'utilisation la plus efficace d'une instruction SARG et INDEXES –

+0

@BuddhiDananjaya Même dans le cas de "@PRODUCT_TYPE_ID" étant une variable? Je pensais que nous devons seulement faire attention à ce sujet dans le cas de colonnes dans la requête. – DVT

1

Essayez cette

SELECT * FROM PRODUCT 
WHERE 
    PRODNAME = @pName 
AND 
    (
    (PRODUCT_TYPE_ID IN (SELECT DISTINCT ID FROM PPRODUCT_TYPE) and @PPRODUCT_TYPE_ID != '0') 
    OR 
    (@PPRODUCT_TYPE_ID = '0') 
    )