Sql server where子句中的SQL用例

Sql server where子句中的SQL用例,sql-server,tsql,case,Sql Server,Tsql,Case,以下是表格的一个示例: acIdent | acSubject | acCode 200.2.013 | | F-202 200.2.013 | Minsk traktor works | F202.GRS 这就是我试图做的: declare @subj varchar(30) set @subj = 'Minsk traktor works' select acId

以下是表格的一个示例:

     acIdent   |  acSubject          | acCode
     200.2.013 |                     | F-202
     200.2.013 | Minsk traktor works | F202.GRS
这就是我试图做的:

     declare @subj varchar(30)

     set @subj = 'Minsk traktor works'

     select acIdent, acSubject, acCode
     from tHE_SetItemExtItemSubj where acIdent = '200.2.013' and
     acSubject = (
            case 
            when @subj = acSubject then @subj
            else '' end
         )
我的目标是只获得一项记录。我的示例返回两条记录。 当@sub存在于表中时,返回acCode-F202.GRS,否则返回F-202


请帮忙

如果我理解正确,您正在寻找这样的东西:

 declare @subj varchar(30)

 set @subj = 'Minsk traktor works'

 select top(1) acIdent, acSubject, acCode
 from tHE_SetItemExtItemSubj 
 where acIdent = '200.2.013' 
   and (acSubject = @subj or acSubject = '')
 order by len(acSubject) desc

我已将您的上述查询编译如下:

declare @MyTable as table
    (   ID  int identity primary key
    ,   acIdent     varchar(100)
    ,   acSubject   varchar(200)
    ,   acCode      varchar(100)
    )

insert into @MyTable
    (   acIdent
    ,   acSubject
    ,   acCode  )
    values
    (   '200.2.013'
    ,   ''
    ,   'F-202' ),
    (   '200.2.013'
    ,   'Minsk traktor works'
    ,   'F-202' )

declare @subj varchar(30)

    set @subj = 'Minsk traktor works'

    select
        acIdent
    ,   acSubject
    ,   acCode
    ,   case acSubject when  @subj then @subj else '' end
    from @MyTable where acIdent = '200.2.013'
    and  acSubject = (case when acSubject = @subj then @subj else '' end)

    select
        acIdent
    ,   acSubject
    ,   acCode
    ,   case acSubject when  @subj then @subj else '' end
    from @MyTable where acIdent = '200.2.013'
    and  acSubject = @subj
从这两个查询中,您会注意到第一个查询将始终为您提供两行,因为您的代码有缺陷

您将注意到的第二个查询将只提供一条记录

结果如下所示:

 declare @subj varchar(30)

 set @subj = 'Minsk traktor works'

 select top(1) acIdent, acSubject, acCode
 from tHE_SetItemExtItemSubj 
 where acIdent = '200.2.013' 
   and (acSubject = @subj or acSubject = '')
 order by len(acSubject) desc

这不会有帮助,因为您只能使用一个条件获取一条记录。如果您必须只检查单个条件,为什么要使用用例

declare @subj varchar(30)
set @subj = 'Minsk traktor works'
select top(1) acIdent, acSubject, acCode
from tHE_SetItemExtItemSubj 
where acIdent = '200.2.013' 
and (acSubject = @subj)

可以使用case函数执行以下操作:

 -- assumes @subj is not '' nor null. 
 select y.acIdent, y.acSubject, y.acCode
 from tHE_SetItemExtItemSubj y
 where y.acIdent = '200.2.013' 
   and y.acSubject = 
   (case 
    when exists(select * from  tHE_SetItemExtItemSubj x where 
                x.acIdent = y.acIdent and x.acSubject = @subj) 
    then @subj else '' 
    end)
Case函数也可以嵌套。下面是一个与上述功能相同的示例(在本例中可能有些过分,但当您执行更复杂的操作时,该技术可能会很有用):


我不明白你的逻辑。如果
@subm=acSubject
,则
acSubject=@subm
(它们是相同的表达式)。您的逻辑不是简单地
acSubject在(sub,”)
中的位置吗?您能否提供更多示例数据和预期结果?1个例子通常不能帮助描述完整的需求。是的,这就是我想要的。但是,是否有可能从用例中得到相同的结果?非常感谢你你是对的,我明白为什么我会得到两个结果。您的示例仅在acSubject为“Minsk traktor works”或“如果表中不存在“Minsk traktor works”,则acSubject应为“”,并且返回acCode-F-202 HoneyBadger解决了我的问题,但我仍然怀疑这是否可以通过案例实现。