2016-11-07 8 views
0

パラメータを変更するだけでなく、SQL Serverの2014クエリのWHERE句で完全に異なる条件を使用したいと考えています。WHERE句で条件付きの異なる列を使用する方法は?

私は変数の@ cwid2がNULLまたは空の場合、私はそうここ

dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2 

でAND-書の全体の最初の部分を交換したいのですが、次の句

WHERE  (dbo.SecurityCheckUserInADGroups.CWID = @cwid2) AND (dbo.SecurityCheckUserInDatabaseRoles.Server = @server) 

を持っていますパラメータだけでなく列も変化します。

私は、場合にこのような何かを持つケースとIIFを試してみましたが、それは受け入れられません。

(IIF (LEN(@cwid1) > '0, 'dbo.SecurityCheckUserInADGroups.CWID = @cwid2','dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2')) 

それは、「条件があるコンテキストで指定された非ブール型の式を私に告げる保ちます期待 "

どのように私はこれを解決することができますか?

+0

代わりにAND/ORを使用してください。 – jarlh

答えて

0
WHERE CASE WHEN ISNULL(@cwid2,'') <> '' THEN dbo.SecurityCheckUserInADGroups 

.CWID = @ cwid2 ELSE dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @ END role2のAND dbo.SecurityCheckUserInDatabaseRoles.Server = @server

0

ただ、基本的なロジックを使用します。最も一般的な

WHERE ((@cwid <> '' AND dbo.SecurityCheckUserInADGroups.CWID = @cwid2) OR 
     (COALESCE(@cwid, '') = '' AND dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2) 
    ) AND 
     (dbo.SecurityCheckUserInDatabaseRoles.Server = @server) 
0

をソリューションは

Where (@var is null and col1=val1) 
    Or (@var is not null and col2=val2) 

です。クエリオプティマイザはO R、私はパフォーマンスが問題(大きなデータセットなど)になる可能性があるときには他のソリューションを探す傾向がありますが、上記を最初に試す価値があるかもしれません。

もっと具体的なものが必要な場合は、iifロジックのトリックは評価する述語ではなく、比較する値を返すことです。 COL2の値のようにvarがnullのとき - - あなたがここでの考え方は、あなたが例の「気にしない」ということです

Where col1 = iif(@var is null, val1, col1) 
    And col2 = iif(var is null, col2, val2) 

ような何かを行うことができ、「常に真」として解決します。しかし、この特定の解決策が失敗する場合があります(col1またはcol2がNULLの場合など)。

これが最初のアプローチが最も一般的な理由です。

関連する問題