将 isNull 替换为 If Exists

Replace a isNull with If Exists

我有一个存储过程,它可以 return 没有行,在这种情况下,我想将 'Other' 作为一个值。 我的程序设置了我的列“@col”的值,我尝试使用 ISNULL 但它是错误的

update cal
set '+@col+' = isnull(p.par_name, ''Other'')
from #CALENDAR cal
inner join #WEBSITES w on w.par_id = cal.par_id and
    (
        w.bur_id = cal.bur_id
        or
        (w.date = cal.Date or (w.[date] is null and cal.Date is null))
    )
left join partner p on p.par_id = isnull(w.par_id,-1) AND tpa_id = 3 -- partner de type advertiser
where website_id ='+convert(varchar(3), @wid)

我试过像这样输入 IF EXIST,但没有成功:

update cal
set '+@col+' = if exists (p.par_name
from #CALENDAR cal
inner join #WEBSITES w on w.par_id = cal.par_id and
    (
        w.bur_id = cal.bur_id
        or
        (w.date = cal.Date or (w.[date] is null and cal.Date is null))
    )
left join partner p on p.par_id = isnull(w.par_id,-1) AND tpa_id = 3 -- partner de type advertiser
where website_id ='+convert(varchar(3), @wid)+') else ''Other'' '

为了简化查询,我所做的是(混合 sql 和 c#):

if(w.par_id = null)
 select p.par_name from partner p where p.par_id = -1 <= will return nothing, an empty row
THEN if(p.par_name is EMPTY) THEN p.par_name='Other'

这将 return 没有行,在那种情况下我想把 'Other'

您可以使用COALESCE()功能。 COALESCE() 函数 returns 列表中的第一个非空表达式。以下是语法:

COALESCE(expr1, expr2, ...., expr_n)

expr1, expr2, expr_n - 要测试的 expressions/col/value

您可以使用的几个选项:

  1. @@ROWCOUNT:做你的常规 select 然后检查 @@ROWCOUNT 的值,如果它是 0 那么前面的语句返回 0 行,所以你可以用你的硬编码值做额外的SELECT

    SELECT p.par_name
    FROM #CALENDAR
    WHERE --...
    
    IF @@ROWCOUNT = 0
    BEGIN
        SELECT 'Other' AS par_name
    END
    
  2. 验证 C# 代码中的结果集。检查结果集是否有 0 行,然后直接在 C# 中生成你的值。

  3. 对您的结果集执行 LEFT JOIN 并生成第 1 行 table。

    SELECT
        ISNULL(X.par_name, G.par_name) AS par_name
    FROM
        (VALUES ('Other')) AS G(par_name)
        LEFT JOIN (
    
            SELECT
                p.par_name
            from 
                #CALENDAR cal
                inner join #WEBSITES w on w.par_id = cal.par_id and
                    (
                        w.bur_id = cal.bur_id
                        or
                        (w.date = cal.Date or (w.[date] is null and cal.Date is null))
                    )
                left join partner p on p.par_id = isnull(w.par_id,-1) AND tpa_id = 3 -- partner de type advertiser
            where 
                website_id = '+convert(varchar(3), @wid)'
        ) 
        AS X ON G.par_name = X.par_name
    

不要使用 EXISTS,因为您将被迫重复查询,导致额外的维护工作。

函数 isnull(p.par_name, ''Other'') 仅在 select returns 1 行且该行中的列 par_nameNULL 时才有效。

要解决此问题,请先设置变量名称,以防 select 中没有行,然后执行 select。像这样...

-- set value in case no rows are found
set @col = 'Other'

-- if a row is found and there is a null, set the value again to Other
select @col = isnull(p.par_name, 'Other')
from #CALENDAR cal
inner join #WEBSITES w on w.par_id = cal.par_id and
    (
        w.bur_id = cal.bur_id
        or
        (w.date = cal.Date or (w.[date] is null and cal.Date is null))
    )
left join partner p on p.par_id = isnull(w.par_id,-1) AND tpa_id = 3 -- partner de type advertiser
where website_id ='+convert(varchar(3), @wid)