【问题标题】:where Column1 = case @var = 0 then null其中 Column1 = case @var = 0 然后为 null
【发布时间】:2020-08-18 10:11:35
【问题描述】:

我有以下 CTE 分层查询。

declare @Cat_Fkey int = 0;
WITH CTE AS
(
    SELECT tblCategories.ID as  RowID,  CatEName as RowName
    FROM tblCategories 
    WHERE Cat_Fkey  is null
    UNION ALL
    SELECT t.id, cast(cte.RowName +' '+ t.CatEName as varchar(100))
    FROM tblCategories t
    INNER JOIN CTE ON t.Cat_Fkey = CTE.RowID    
)

我想在 where 子句上有一个案例。例如

WHERE Cat_Fkey = case
when @Cat_Fkey = 0 then null
else @Cat_Fkey
end

我知道哪里是null和=null不一样,上面的查询只是一个表示。

我希望结果是@cat_fkey = 0,然后 cat_fkey 为空。 而当@cat_fkey ,那么在哪里 cat_fkey @cat_fkey.

【问题讨论】:

  • 不要在WHERE 中使用CASE 表达式。使用ANDOR 子句。 CASE 表达式不是 SARGable,这意味着不能使用任何索引来帮助数据引擎过滤表中的行。

标签: sql sql-server where-clause common-table-expression recursive-query


【解决方案1】:

使用布尔逻辑:

where 
    (@cat_fkey = 0 and cat_fkey is null)
    or (cat_fkey = @cat_fkey)

【讨论】:

    【解决方案2】:

    按照 Larnu 的建议,我使用了 and/or

    WHERE (@Cat_Fkey = 0 and Cat_Fkey is null) or (Cat_Fkey = @Cat_Fkey)
    

    【讨论】:

    • 我假设,由于这个逻辑,这意味着Cat_Fkey 列的值可以是0
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多