2016-11-07 33 views
0

我想在SQL Server 2014查詢的WHERE子句中使用完全不同的條件,而不僅僅是更改參數。如何在WHERE子句中使用條件不同的列?

我有以下條款

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

如果變量@ cwid2爲null或空,我想因此,這裏有

dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2 

更換該與聲明的整個第一部分不僅參數而且列更改。

我想如果凱斯和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 = @ role2所端和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邏輯的訣竅是它返回一個要比較的值,而不是要評估的謂詞。你可以這樣做

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

這裏的想法是,你「不關心」的情況 - 當var爲空像COL2的價值 - 解決爲「總是爲真」。但有些情況下(比如col1或col2可能爲NULL),這種特定的解決方案將會失敗。

這就是爲什麼第一種方法是最一般的方法