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 = '' 连接前。因此,如果 @resultnull 而不是 '' 开始 iwth,则最终合并可以简化为:

set @result = coalesce(@result,'NORECS');

关于您到处使用 nolock,您可能需要重新考虑这样做的原因。