我有一种情况,如果输入变量等于某个字符串,我想评估一个条件,否则,我不在乎那个条件。
我曾尝试同时使用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放在查询之前,并且在过程中有两种版本的查询,一种评估状态还有一个不这样做。似乎会有一个更雄辩的解决方案,但如果没有,我将继续解决。
这似乎使您可以使用动态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;
您可以在没有动态SQL的情况下执行此操作:
SELECT * from business_auth
where (@group = 'COM' AND (@state = AddressState or AddressState is null))
OR NOT (@group = 'COM')