如何在WHERE子句中使用IF或CASE评估变量

问题描述 投票:0回答:2

我有一种情况,如果输入变量等于某个字符串,我想评估一个条件,否则,我不在乎那个条件。

我曾尝试同时使用IF和CASE来执行此操作,但是语法不正确。也许这是不可能的,或者我只是在正确的地方没有所有的括号?

    Declare @state nvarchar(255) = 'KY'
,@group nvarchar(255) = 'COM'

SELECT * from business_auth
where (case when @group = 'COM'
            then (@state = AddressState or AddressState is null)
            else 1=1
            end)

如果该组是COM,我希望它查看状态列,但是对于其他任何组,我都不关心该状态。我在这里还有一堆其他AND评估,所以我宁愿不必重写整个内容或将IF放在查询之前,并且在过程中有两种版本的查询,一种评估状态还有一个不这样做。似乎会有一个更雄辩的解决方案,但如果没有,我将继续解决。

tsql
2个回答
0
投票

这似乎使您可以使用动态SQL更好:

DECLARE @state nvarchar(255) = N'KY',
        @group nvarchar(255) = N'COM';


DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = N'SELECT *' + @CRLF +
           N' FROM dbo.business_auth' +
           CASE WHEN @group = 'COM' THEN @CRLF + N'WHERE @state = AddressState OR AddressState IS NULL' ELSE N'' END + N';';

EXEC sp_executesql @SQL, N'@state nvarchar(255)', @State;

0
投票

您可以在没有动态SQL的情况下执行此操作:


SELECT * from business_auth
where (@group = 'COM' AND (@state = AddressState or AddressState is null))
      OR NOT (@group = 'COM')      

© www.soinside.com 2019 - 2024. All rights reserved.