Sql 过滤器只得到一个条件
我在WHERE子句中有一个验证,如:Sql 过滤器只得到一个条件,sql,tsql,Sql,Tsql,我在WHERE子句中有一个验证,如: ... AND (@BDOnly = 0 OR [DT].[Abbreviation] = @IsBDChecked) AND (@CDOnly = 0 OR [DT].[Abbreviation
...
AND (@BDOnly = 0
OR [DT].[Abbreviation] = @IsBDChecked)
AND (@CDOnly = 0
OR [DT].[Abbreviation] = @IsCDChecked)
AND (@PPOOnly = 0
OR [DT].[Abbreviation] = @IsPPOChecked)
AND (@FBOMOnly = 0
OR [DT].[Abbreviation] = @IsFBOMChecked)
AND (@APOnly = 0
OR [DT].[Abbreviation] = @IsAPChecked)
AND (@COOnly = 0
OR [DT].[Abbreviation] = @IsCOChecked)
因此,每个AND子句检查布尔值是否为位值0
或1
,如果是0
,只需执行任何操作,但如果是1
,则执行过滤器。我的问题是
如果我发送两个值为1
,我的意思是
@BDOnly=1
和@CDOnly=1
它只过滤其中一个,而得到两个过滤器,我的意思是:
[DT].[Abbreviation] = @IsBDChecked
及
我做错了什么?关于我在这里猜测一下,因为没有足够的数据。如果要仅在设置了
@BDOnly
时返回一行缩写
匹配的@IsBDChecked
,并且在设置了@CDOnly
时返回另一行缩写匹配的@IsCDChecked
,请尝试以下操作:
(@BDOnly = 1
AND [DT].[Abbreviation] = @IsBDChecked)
OR (@CDOnly = 1
AND [DT].[Abbreviation] = @IsCDChecked)
OR (@PPOOnly = 1
AND [DT].[Abbreviation] = @IsPPOChecked)
OR (@FBOMOnly = 1
AND [DT].[Abbreviation] = @IsFBOMChecked)
OR (@APOnly = 1
AND [DT].[Abbreviation] = @IsAPChecked)
OR (@COOnly = 1
AND [DT].[Abbreviation] = @IsCOChecked)
小型代表性案例:
DECLARE @ADOnly BIT = 0
, @BDOnly BIT = 1
, @CDOnly BIT = 1
, @IsADChecked NVARCHAR(100) = 'A'
, @IsCDChecked NVARCHAR(100) = 'C'
, @IsBDChecked NVARCHAR(100) = 'B'
;WITH myTable AS
(
SELECT * FROM (VALUES ('A'), ('B'), ('C')) X(Abbreviation)
)
SELECT *
FROM myTable
WHERE (@ADOnly = 1 AND Abbreviation = @IsADChecked)
OR (@BDOnly = 1 AND Abbreviation = @IsBDChecked)
OR (@CDOnly = 1 AND Abbreviation = @IsCDChecked)
收益率:
Abbreviation
------------
B
C
您认为未正确筛选的记录的@IsBDChecked
、@IsCDChecked
和缩写
的值是多少?您会找到您需要的内容。它只是一个字符串,我想问题在于它只筛选了其中一个,我希望得到的结果是按字符串1过滤和按字符串2过滤,因此结果应该包含两个字符串值的组合@MarcinJNo。如果它只是一个字符串,那么字符串(缩写)不能等于两个不同的字符串(两个变量)。这就是为什么你必须让我们知道这些价值观是什么,或者可能是什么,否则我们将无法帮助你。
Abbreviation
------------
B
C