2017-03-27 9 views
0

これを動作させるにはどうすればよいですか?値が空でない場合はin節を追加し、値は空白です。私はすでにORを使って試してみましたが、それは実行されますが、私が望む結果は得られません。私は、SQL Serverを使用しています2008年変数が空白であるかどうかに応じて複数の句を追加する(ストアドプロシージャ)SQL Server

は私の変数は次のとおりです。

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

は今、私はそれが600行の合計があるとして、ストアドプロシージャの束を取り出したが、これは私がやりたい正確に何を説明する必要があります。私は高低を検索しており、これに対する解決策は見つかりませんでした。

クエリは次のとおりです。

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

区切りリストの代わりにテーブル値のパラメータを使用することを検討しましたか?これは作業が容易で、どのスプリッタよりも高速になります。 –

+0

私の分割機能はテーブル値関数です。あなたはこれを参照していますか? –

+0

はい。テーブル値のパラメータは信じられないほど速く、扱いが簡単です。 –

答えて

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

これはすごくうまくいっています。ご協力いただきありがとうございます。 –

+0

ようこそ。 – IngoB

0

A本当にハック方法をcase表現使用して::

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をまだ

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') 

これは私が何をしたいですむしろハッピーな方法を使用して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)) 

もっと良い方法は、条件付きであなたのwhereステートメントを構築し、sp_executesql

参考にパラメータを渡すために、動的SQLを使用します。

関連する問題