Sql 如果存在,将isNull替换为

Sql 如果存在,将isNull替换为,sql,sql-server,if-statement,isnull,Sql,Sql Server,If Statement,Isnull,我有一个存储过程,它不能返回任何行,在这种情况下,我想把'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 o

我有一个存储过程,它不能返回任何行,在这种情况下,我想把'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'
它将不返回任何行,在这种情况下,我想放置'Other'

您可以使用COALESCE函数。COALESCE函数返回列表中的第一个非空表达式。以下是语法:

COALESCE(expr1, expr2, ...., expr_n)
expr1、expr2、expr\n-要测试的表达式/col/value

您可以使用COALESCE函数。COALESCE函数返回列表中的第一个非空表达式。以下是语法:

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

expr1、expr2、expr\n-要测试的表达式/col/value

您可以使用以下几个选项:

@@ROWCOUNT:对@ROWCOUNT的值进行常规的select和aftwards检查,如果该值为0,则上一条语句返回0行,这样您就可以用硬编码的值进行额外的select

SELECT p.par_name
FROM #CALENDAR
WHERE --...

IF @@ROWCOUNT = 0
BEGIN
    SELECT 'Other' AS par_name
END
在C代码中验证结果集。检查结果集是否有0行,然后直接在C中生成值

对结果集使用生成的1行表进行左联接

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,因为您将被迫复制查询,从而导致额外的维护。

您可以使用以下几个选项:

@@ROWCOUNT:对@ROWCOUNT的值进行常规的select和aftwards检查,如果该值为0,则上一条语句返回0行,这样您就可以用硬编码的值进行额外的select

SELECT p.par_name
FROM #CALENDAR
WHERE --...

IF @@ROWCOUNT = 0
BEGIN
    SELECT 'Other' AS par_name
END
在C代码中验证结果集。检查结果集是否有0行,然后直接在C中生成值

对结果集使用生成的1行表进行左联接

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,因为您将被迫复制查询,从而导致额外的维护。

函数为Nullp.par_name,其他仅在select返回1行且该行中的列par_name为NULL时有效

要解决此问题,请首先设置变量名,以防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)
函数isnullp.par_name,Other仅在select返回1行且该行中的列par_name为NULL时起作用

要解决此问题,请首先设置变量名,以防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)

设置“++@col++”的语法是什么?要将值设置为变量,可以使用如下语法设置@col='value'。你的代码做了另一件事当你说它错了,你是什么意思?查询是否抛出了错误,或者您得到了错误的结果?@GordonLinoff我的语法是正确的我只是没有放入完整的查询,我编辑了:这是一个错误update@Aidan值不会为null,查询将不返回任何内容,哪一个不是空的“++@col++”设置了什么样的语法?要将值设置为变量,可以使用如下语法集@col='value'。你的代码做了另一件事当你说它错了,你是什么意思?查询是否抛出了错误,或者您得到了错误的结果?@GordonLinoff我的语法是正确的我只是没有放入完整的查询,我编辑了:这是一个错误update@Aidan该值不会为null,查询只会返回nothing,这在您的上一个命题中不是null,X和G是什么?同一个表伙伴看到我的左连接了吗?@Benoît G是一个生成的表,值为“Other”,您可以看到它在值“Other”处被别名为Gpar_名称,而X是您的整个查询,它被括在括号中,并在最后一行被别名。在您的最后一个命题中,X和G是什么?同一个表伙伴看到我的左连接了吗?@Benoît G是一个生成的表,其值为“Other”,您可以看到它在值“Other”处被别名为Gpar_名称,而X是您的整个查询,它被括在括号中,并在最后一行被别名。