Sql 仅在位=1时使用where子句
我有一些SQL代码现在看起来像这样Sql 仅在位=1时使用where子句,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一些SQL代码现在看起来像这样 insert into @SortedProducts (peid) select pd.ProductEntryId from @ProductFilters FILT INNER JOIN J_ProductDetails pd ON FILT.ProductEntryId = pd.ProductEntryId WHERE pd.Active = 'True' and pd.IsRangeOfPr
insert into @SortedProducts (peid)
select pd.ProductEntryId
from @ProductFilters FILT
INNER JOIN J_ProductDetails pd ON FILT.ProductEntryId = pd.ProductEntryId
WHERE pd.Active = 'True'
and pd.IsRangeOfProducts = CASE WHEN @ClearanceFeatureApplied = 1 then 0 else 1 END
但是,在最后一行,我只想在@ClearanceFeatureApplied=1时应用where子句
如果@ClearanceFeatureApplied=0,那么我不应该有这个where子句。产品的pd.I范围也有点大
如有任何建议,将不胜感激
谢谢 只需使用布尔逻辑:
insert into @SortedProducts (peid)
select pd.ProductEntryId
from @ProductFilters FILT join
J_ProductDetails pd
on FILT.ProductEntryId = pd.ProductEntryId
where pd.Active = 'True' and
(@ClearanceFeatureApplied <> 1 or pd.IsRangeOfProducts = 0) ;
插入@SortedProducts(peid)
选择pd.ProductEntryId
来自@ProductFilters FILT join
J_产品详细信息pd
在FILT.ProductEntryId=pd.ProductEntryId上
其中pd.Active='True'和
(@ClearanceFeatureApplied 1或pd.IsRangeOfProducts=0);
当@ClearanceFeatureApplied=0时,您可以将OR添加到where子句(用括号括起来)以忽略此部分:
insert into @SortedProducts (peid)
select pd.ProductEntryId
from @ProductFilters FILT
INNER JOIN J_ProductDetails pd ON FILT.ProductEntryId = pd.ProductEntryId
WHERE pd.Active = 'True'
and (@ClearanceFeatureApplied = 0 OR pd.IsRangeOfProducts = CASE WHEN @ClearanceFeatureApplied = 1 then 0 else 1 END)
如果您的位列中有空值,则需要对此进行组合。如果我理解正确,则可能类似于:
WHERE pd.Active = 'True'
and 1 = CASE WHEN @ClearanceFeatureApplied = 0 THEN 1
WHEN pd.IsRangeOfProducts = 0 THEN 1 -- XX
ELSE 0 END
以上假设@ClearanceFeatureApplied将不为空。
如果您到达第XX行,那么@ClearanceFeatureApplied将始终为1,
所以我优化了条件:
and pd.IsRangeOfProducts = CASE WHEN @ClearanceFeatureApplied = 1 then 0 else 1 END
致:
其中@ClearanceFeatureApplied=1和pd.Active='True'和pd.IsRangeOfProducts=0您不觉得条件在哪里看起来很奇怪吗?当@ClearanceFeatureApplied=0时,此查询无法使条件“pd.Active='True'”忽略这就是为什么有括号的原因。这意味着在检查pd.Active之前将首先解决它。您可以这样简化:
其中pd.Active='True'和(@ClearanceFeatureApplied=0或pd.IsRangeOfProducts=~@ClearanceFeatureApplied)
这是一个更好的答案,但我认为应该是(@ClearanceFeatureApplied 1或pd.IsRangeOfProducts=0)
-如果@ClearanceFeatureApplied=1,则您只需要pd.IsRangeOfProducts=~@ClearanceFeatureApplied@GordonLinoff非常感谢:)
pd.IsRangeOfProducts = 0