我最近一直在使用SQL来克服我的编程。我正在尝试创建一个执行select的函数,如果它查看同一个Analyte的任何重复项(> 1),它将创建一个字符串。
例如,如果select语句拉回apples, oranges, peanuts, grapes, grapes, peaches, oranges, pineapple
,我将获得一个oranges,grapes
的字符串。但是,如果没有重复,系统就会出错,因为我试图在没有任何东西的情况下使用子串调用。
如何使用IF-Statment将其传回" 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
尝试过IF-Statement,其中包括" Else"无论。
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
答案 0 :(得分:2)
你正在经历所有这些麻烦,删除最后一个逗号,并且有几种方法。
一个是使用与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
仍然是一个空字符串(因为您在开头将其设置为一个字符串),请将值更改为' NORECS'使用coalesce()
和nullif()
set @result = coalesce(nullif(@result,''),'NORECS');
使用for xml path('')
版本时,在连接之前不需要set @result = ''
。因此,如果@result
是null
而不是''
来开始,那么最终的合并可以简化为:
set @result = coalesce(@result,'NORECS');
关于您在任何地方使用nolock
,您可能需要重新考虑这样做背后的原因。
答案 1 :(得分:1)
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