Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅在位=1时使用where子句_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 仅在位=1时使用where子句

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

我有一些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.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