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解决了我的问题,但我仍然怀疑这是否可以通过案例实现。