2017-03-27 8 views
0

Comment suis-je capable de faire fonctionner cela Je veux ajouter à la clause si la valeur n'est pas vide et ne pas écrire la clause in si le la valeur est vide. J'ai déjà essayé d'utiliser OU et ça fonctionne mais ne me donne pas les résultats que je veux. J'utilise SQL Server 2008.Ajouter plusieurs clauses dans si la variable est vide ou non (procédure stockée) SQL Server

Mes variables sont:

@orderNumber varchar(max), 
@itemCode varchar(max), 
@shipTo varchar(max), 
@orderQty varchar(max), 
@orderType varchar(max) 

Maintenant, je pris un tas de la procédure stockée comme il est un total de 600 lignes, mais cela devrait expliquer exactement ce que je veux faire . J'ai cherché haut et bas et n'ai trouvé aucune solution pour cela.

La requête est:

SELECT 
    u.INVENTORY_ITEM_ID, u.ORDER_TYPE, 
    u.ORDER_QTY, u.ORDER_NUMBER, 
    u.SHIP_TO_NAME, u.ITEM_CODE AS SET_BOX, 
    ii.ITEM_CODE, 
    U.LANGUAGE_DESC 
FROM 
    UnReleased_DeliveriesSet u 
JOIN 
    SetDetails s ON u.item_code = s.SetCode 
FULL OUTER JOIN 
    InventorySetBox i ON u.ITEM_CODE = i.ITEM_CODE 
FULL OUTER JOIN 
    InventorySetBox ii ON ii.ITEM_CODE = s.ItemCode 
FULL OUTER JOIN 
    SET_BOX_TYPE SB ON SB.ITEM_CODE = u.ITEM_CODE 
WHERE 
    u.item_code LIKE '%.set%' 
    AND u.item_code NOT LIKE '%NN-%SET%' 
    AND ii.ITEM_CODE IS NOT NULL 
    AND ii.SUBINVENTORY_CODE <> 'BMS' 
    AND u.ITEM_CODE NOT IN ('inner query') 

Voici ce que je veux faire:

AND 
     CASE WHEN @itemCode != '' 
       THEN u.ITEM_CODE IN (SELECT items FROM dbo.Split(@itemCode,',')) 
      WHEN @orderType != '' 
       THEN u.ORDER_TYPE IN (SELECT items FROM dbo.Split(@orderType,',')) 
      WHEN @orderQty != '' 
       THEN u.ORDER_QTY IN (SELECT items FROM dbo.Split(@orderQty, ',')) 
      WHEN @orderNumber != '' 
       THEN u.ORDER_NUMBER IN (SELECT items FROM dbo.Split(@orderNumber, ',')) 
      WHEN @shipTo != '' 
       THEN u.SHIP_TO_NAME in (SELECT items FROM dbo.Split(@shipTo, ',')) 
     END 
GROUP BY 
    u.INVENTORY_ITEM_ID, u.ITEM_CODE, 
    U.LANGUAGE_DESC, 
    i.item_box_quantity, 
    sb.BOX_TYPE, sb.set_box_qty, 
    ii.ITEM_CODE, 
    S.SetCode, RELEASED_STATUS, 
    u.ORDER_TYPE, u.ORDER_QTY, u.ORDER_NUMBER, u.SHIP_TO_NAME 
+0

Avez-vous envisagé d'utiliser la table des paramètres évalués au lieu des listes délimitées? Il est plus facile de travailler avec et ils seront beaucoup plus rapides que n'importe quel diviseur peut même penser. –

+0

Ma fonction de division est une fonction de valeur de table. Est-ce cela que vous voulez dire? –

+0

Oui. les paramètres de table sont incroyablement rapides et super simples à travailler. –

Répondre

1
and 1 = case 
     when @itemCode != '' then case 
            when u.ITEM_CODE in (SELECT items FROM dbo.Split(@itemCode,',')) then 1 
            else 0 
            end 
     when @orderType != '' then case 
            when u.ORDER_TYPE in (SELECT items FROM dbo.Split(@orderType,',')) then 1 
            else 0 
            end 
     when @orderQty != '' then case 
            when u.ORDER_QTY in (SELECT items FROM dbo.Split(@orderQty,',')) then 1 
            else 0 
            end 
     when @orderNumber != '' then case 
             when u.ORDER_NUMBER in (SELECT items FROM dbo.Split(@orderNumber,',')) then 1 
             else 0 
             end 
     when @shipTo != '' then case 
            when u.SHIP_TO_NAME in (SELECT items FROM dbo.Split(@shipTo,',')) then 1 
            else 0 
           end 
     else 0 
     end 
+0

Cela a fonctionné à merveille, merci pour votre aide. –

+0

De rien. – IngoB

0

Une façon vraiment aki en utilisant case expressions:

and 1 = case when @itemCode = '' or u.ITEM_CODE in (SELECT items FROM dbo.Split(@itemCode,',') s) then 1 else 0 end 
and 1 = case when @orderType = '' or u.ORDER_TYPE in (SELECT items FROM dbo.Split(@orderType,',') s) then 1 else 0 end 
and 1 = case when @orderQty = '' or u.ORDER_QTY in (SELECT items FROM dbo.Split(@orderQty,',') s) then 1 else 0 end 
and 1 = case when @orderNumber = '' or u.ORDER_NUMBER in (SELECT items FROM dbo.Split(@orderNumber,',') s) then 1 else 0 end 
and 1 = case when @shipTo = '' or u.SHIP_TO_NAME in (SELECT items FROM dbo.Split(@shipTo,',') s) then 1 else 0 end 

A encore manière plutôt hacky en utilisant or

and (@itemCode = '' or u.ITEM_CODE in (SELECT items FROM dbo.Split(@itemCode,',') s)) 
and (@orderType = '' or u.ORDER_TYPE in (SELECT items FROM dbo.Split(@orderType,',') s)) 
and (@orderQty = '' or u.ORDER_QTY in (SELECT items FROM dbo.Split(@orderQty,',') s)) 
and (@orderNumber = '' or u.ORDER_NUMBER in (SELECT items FROM dbo.Split(@orderNumber,',') s)) 
and (@shipTo = '' or u.SHIP_TO_NAME in (SELECT items FROM dbo.Split(@shipTo,',') s)) 

Une bien meilleure façon utiliserait sql dynamique pour construire conditionnellement votre déclaration where et vos paramètres au sp_executesql

Référence: