SQL 函数内的 IF 语句
SQL IF-Statment within funciton
我最近一直在 SQL 工作以维持我的编程。我正在尝试创建一个执行 select 的函数,如果它查看同一分析物的任何重复项 (>1),它将创建一个字符串。
比如select语句拉回apples, oranges, peanuts, grapes, grapes, peaches, oranges, pineapple
我会得到一个oranges,grapes
的字符串。但是,如果没有重复项,系统会因错误而中断,因为我试图在任何情况下都使用子字符串调用。
如果结果仍然为空,如何使用 IF 语句使其传回 "NORECS",如果结果不为空,如何使用子字符串功能?
如果 select 不提取重复项就会中断的工作代码:
Declare @result varchar(1000)
set @result = ''
select @result = @result + R.ANALYTE + ','
FROM results R (NOLOCK)
left join tests T (NOLOCK) on (T.testcode = R.testcode)
where
T.SHOW='Y' and R.SA='Show'
and R.ID = 3094083
group by R.ANALYTE
having COUNT(*)>1
select substring(@result, 1, len(@result) - 1) AS MissingAnas
尝试执行 "Else" 的 IF 语句。
Declare @result varchar(1000)
set @result = ''
select @result = @result + R.ANALYTE + ','
FROM results R (NOLOCK)
left join tests T (NOLOCK) on (T.testcode = R.testcode)
where
T.SHOW='Y' and R.SA='Show'
and R.ID = 3094083
group by R.ANALYTE
having COUNT(*)>1
if (Count(@result)>1)
Begin
select substring(@result, 1, len(@result) - 1) AS MissingAnas
End
Else
Begin
set @result = 'NORECS'
select @result AS MissingAnas
End
Use RETURN Statement in below format :
Declare @result varchar(1000)
set @result = ''
select @result = @result + R.ANALYTE + ','
FROM results R (NOLOCK)
left join tests T (NOLOCK) on (T.testcode = R.testcode)
where
T.SHOW='Y' and R.SA='Show'
and R.ID = 3094083
group by R.ANALYTE
having COUNT(*)>1
if (Count(@result)>1)
Begin
SET @result = substring(@result, 1, len(@result) - 1)
End
Else
Begin
SET @result = 'NORECS'
End
SELECT @result
您正在经历所有这些麻烦来删除最后一个逗号,并且有几种解决方法。
一个是使用与 stuff()
with select ... for xml path ('')
method of string concatenation 不同的连接。
select @result = stuff((
select ',' + r.analyte
from results R (nolock)
left join tests T (nolock)
on T.testcode = R.testcode
where T.show='Y'
and R.sa='show'
and R.id = 3094083
group by R.analyte
having count(*)>1
for xml path (''), type).value('.','nvarchar(max)')
,1,1,'')
然后如果 @result
仍然是一个空字符串(因为你一开始就将它设置为一个),使用 coalesce()
和 nullif()
将值更改为 'NORECS'
set @result = coalesce(nullif(@result,''),'NORECS');
使用 for xml path('')
版本时,您不需要 set @result = ''
连接前。因此,如果 @result
是 null
而不是 ''
开始 iwth,则最终合并可以简化为:
set @result = coalesce(@result,'NORECS');
关于您到处使用 nolock
,您可能需要重新考虑这样做的原因。
我最近一直在 SQL 工作以维持我的编程。我正在尝试创建一个执行 select 的函数,如果它查看同一分析物的任何重复项 (>1),它将创建一个字符串。
比如select语句拉回apples, oranges, peanuts, grapes, grapes, peaches, oranges, pineapple
我会得到一个oranges,grapes
的字符串。但是,如果没有重复项,系统会因错误而中断,因为我试图在任何情况下都使用子字符串调用。
如果结果仍然为空,如何使用 IF 语句使其传回 "NORECS",如果结果不为空,如何使用子字符串功能?
如果 select 不提取重复项就会中断的工作代码:
Declare @result varchar(1000)
set @result = ''
select @result = @result + R.ANALYTE + ','
FROM results R (NOLOCK)
left join tests T (NOLOCK) on (T.testcode = R.testcode)
where
T.SHOW='Y' and R.SA='Show'
and R.ID = 3094083
group by R.ANALYTE
having COUNT(*)>1
select substring(@result, 1, len(@result) - 1) AS MissingAnas
尝试执行 "Else" 的 IF 语句。
Declare @result varchar(1000)
set @result = ''
select @result = @result + R.ANALYTE + ','
FROM results R (NOLOCK)
left join tests T (NOLOCK) on (T.testcode = R.testcode)
where
T.SHOW='Y' and R.SA='Show'
and R.ID = 3094083
group by R.ANALYTE
having COUNT(*)>1
if (Count(@result)>1)
Begin
select substring(@result, 1, len(@result) - 1) AS MissingAnas
End
Else
Begin
set @result = 'NORECS'
select @result AS MissingAnas
End
Use RETURN Statement in below format :
Declare @result varchar(1000)
set @result = ''
select @result = @result + R.ANALYTE + ','
FROM results R (NOLOCK)
left join tests T (NOLOCK) on (T.testcode = R.testcode)
where
T.SHOW='Y' and R.SA='Show'
and R.ID = 3094083
group by R.ANALYTE
having COUNT(*)>1
if (Count(@result)>1)
Begin
SET @result = substring(@result, 1, len(@result) - 1)
End
Else
Begin
SET @result = 'NORECS'
End
SELECT @result
您正在经历所有这些麻烦来删除最后一个逗号,并且有几种解决方法。
一个是使用与 stuff()
with select ... for xml path ('')
method of string concatenation 不同的连接。
select @result = stuff((
select ',' + r.analyte
from results R (nolock)
left join tests T (nolock)
on T.testcode = R.testcode
where T.show='Y'
and R.sa='show'
and R.id = 3094083
group by R.analyte
having count(*)>1
for xml path (''), type).value('.','nvarchar(max)')
,1,1,'')
然后如果 @result
仍然是一个空字符串(因为你一开始就将它设置为一个),使用 coalesce()
和 nullif()
将值更改为 'NORECS'
set @result = coalesce(nullif(@result,''),'NORECS');
使用 for xml path('')
版本时,您不需要 set @result = ''
连接前。因此,如果 @result
是 null
而不是 ''
开始 iwth,则最终合并可以简化为:
set @result = coalesce(@result,'NORECS');
关于您到处使用 nolock
,您可能需要重新考虑这样做的原因。