将 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
您可以使用的几个选项:
@@ROWCOUNT:做你的常规 select 然后检查 @@ROWCOUNT
的值,如果它是 0
那么前面的语句返回 0 行,所以你可以用你的硬编码值做额外的SELECT
。
SELECT p.par_name
FROM #CALENDAR
WHERE --...
IF @@ROWCOUNT = 0
BEGIN
SELECT 'Other' AS par_name
END
验证 C# 代码中的结果集。检查结果集是否有 0 行,然后直接在 C# 中生成你的值。
对您的结果集执行 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_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)
我有一个存储过程,它可以 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
您可以使用的几个选项:
@@ROWCOUNT:做你的常规 select 然后检查
@@ROWCOUNT
的值,如果它是0
那么前面的语句返回 0 行,所以你可以用你的硬编码值做额外的SELECT
。SELECT p.par_name FROM #CALENDAR WHERE --... IF @@ROWCOUNT = 0 BEGIN SELECT 'Other' AS par_name END
验证 C# 代码中的结果集。检查结果集是否有 0 行,然后直接在 C# 中生成你的值。
对您的结果集执行
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_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)