功能中的SQL IF-Statment

时间:2017-03-30 12:29:25

标签: sql sql-server sql-function

我最近一直在使用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

2 个答案:

答案 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 = ''。因此,如果@resultnull而不是''来开始,那么最终的合并可以简化为:

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