首页 > 解决方案 > MS SQL - 我应该用例还有其他方法吗?

问题描述

我需要有关 SQL 代码的帮助。

我有一个看起来像这样的表:

acIdent     acSubject        acCode
201.2.013   Jusel            F-203
201.2.013   Tehnomehanika    F-101 (1,5 mm)

我有一个基于某些过滤器创建报告的应用程序。

这就是我想要实现的:

当我选择 acSubject 'Tehnomehanika',然后返回 'F-101 (1,5 mm)' 当我将其留空时,它将是 '',然后返回 top 1 acCode - 'F-203'

它必须只返回一条记录

我尝试过这样的事情,但它不起作用:

declare @acSubject char(30)

set @acSubject = ''

select
case 
when acSubject = @acSubject then (select acCode  from tHE_SetItemExtItemSubj where acSubject = @acSubject and acIdent = '201.2.013')
else (select top 1 acCode from tHE_SetItemExtItemSubj where acIdent = '201.2.013')
end
from tHE_SetItemExtItemSubj
where acIdent = '201.2.013'
and acSubject = @acSubject

标签: sql-servertsql

解决方案


当我将其留空时,表示它是null''
要涵盖这两种情况,您可以使用coalesce()

select
  case 
    when coalesce(rtrim(ltrim(@acSubject)), '') <> '' then (
      select acCode  from tHE_SetItemExtItemSubj 
      where acSubject = @acSubject and acIdent = '201.2.013'
    )
    else (
      select top 1 acCode from tHE_SetItemExtItemSubj 
      where acIdent = '201.2.013'
    )
  end acCode 

如果列acSubject是唯一的并且第一种情况查询仅返回 1 行,这将起作用,否则您也必须使用它top 1
编写上述逻辑的另一种方法是:

select top 1 acCode 
from tHE_SetItemExtItemSubj 
where 
  acIdent = '201.2.013'
  and 
  (coalesce(rtrim(ltrim(@acSubject)), '') = '' or acSubject = @acSubject) 

推荐阅读