2017-01-12 21 views
0

私はパラメータ@Nameをストアドプロシージャに持っています。このパラメータでフィルタリングする場合は、が空でない場合はnullにします。それ以外の場合は、フィルターを無視したい。条件付きでSQLクエリにフィルタを適用します

私は次の2つの解決策を考え出しました。例として、パラメータが空の場合のみを考えてみましょう。

select * 
    from MyTable 
where (len(rtrim(ltrim(@Name))) > 0 and Name = @Name) or (len(rtrim(ltrim(@Name))) = 0) 

@query = 'select * from MyTable' 
if (len(rtrim(ltrim(@Name))) > 0) 
    @query = @query + ' Name = @Name '  

第予想通りのアプローチの両方が働いています。あなたは(コードの点で)最もクリーンで

  • 簡単にメンテナンス可能だと思います

    • 他の(良い)の選択肢があります。

    注:あなたがそう思うならば、この問題はまた、コードレビューに合わせて、そこ

  • +0

    'または@Nameはnull'なのでありますか? – jarlh

    +0

    @jarlhサンプルをきれいに保つために、これを省略しました – Athafoud

    +0

    @Athafoud:私の答えを見てください。それは、ストロークされたプロシージャが非常に長くなる場合に、クエリを拡張してよりよく維持する方法を示します。私はeaxpleのためにあなたが必要に応じて変更することができ、それは本当にうまく動作するために異なるテーブル名を使用します。 –

    答えて

    3

    を移行するために、それはこの

    select * 
        from MyTable 
    where Name = @Name or @Name = '' or @Name is null 
    

    かで述べたようにように簡略化することができ、コメントしてくださいコメントは、に対してそれを検証し、その後NULLと交換し、その後、空の文字列をチェックするためにNULLIFを使用IS NULL

    where (Name = @Name or nullif(@Name, '') is null) 
    
    0

    ストアドプロシージャで動的SQLを使用している場合は、次のように試してみてください。メインの選択クエリと動的なクエリでは、簡単に拡張できるさまざまな変数を使用することをお勧めします。このアプローチを使用すると、procが長くなったときに維持するのが容易になります。

    declare @finalquery varchar(max) 
        declare @mainSelectquery nvarchar(500); 
        declare @whereCondtions varchar (1000); 
        declare @DateParam datetime 
        set @mainSelectquery='' 
        set @whereCondtions ='' 
    
        set @finalquery ='' 
    
        set @DateParam=getdate() 
        set @mainSelectquery = 'select * from tblOrders where 1=1 ' 
    
        set @whereCondtions = ' and Order_site =''TSN''' 
    
        set @whereCondtions = @whereCondtions + ' AND CAST(ORDER_APPROVED_DATE_LT AS DATE)=CAST(GETDATE() AS DATE)' 
    
        set @finalquery =(@mainSelectquery + @whereCondtions) 
    
        print @finalquery 
    
    ---- You can further extend this by adding more where condition based on the parameter pass in stored proc 
    if (@OrderID !=0) 
    begin 
    set @whereCondtions = ' OrderID='+str (@stateRefID) 
    end 
    
    1
    あなたは、デフォルトでは、長さをチェックする必要はありません

    は、SQL Serverは、末尾-のスペースに敏感である(LIKE述語の式の右辺は、末尾のスペースが含まれている場合は、この規則の唯一の例外は、その後、ありますパッドは取り外されない)。

    次のコードを使用してください。あなたがあなたのケースでは1の結果を得るでしょう、あなた以上の上記のコードを実行した場合

    DECLARE @Name='    ' 
    
    IF(@Name='') SELECT 1 ELSE SELECT 0 
    

    は、あなたがLTRIMとRTRIMをドロップすると、単に空の文字列リテラルに対する等価性をテストすることができます。

    select * 
        from MyTable 
        where ((@Name='' OR @Name IS NULL)OR(Name = @Name)) 
    

    OR

    IF(@Name='') SET @Name=NULL 
    
    select * 
         from MyTable 
         where (@Name IS NULL OR Name = @Name) 
    
    関連する問題