Where条款中的条件 - SQL Server
问题描述:
如何根据传递值过滤条件中的列。Where条款中的条件 - SQL Server
例:
declare @number nvarchar(200)
set @number = '2ddafa3'
这里@number可能是int或uniqueIdentifer
所以在where子句我如何能如下实现的东西。
select * from IntegrationIDTransactions
where case ISNUMERIC(@number)
When 1 Then [TransactioniD] = @number
else [TransactionDomainGuid] = @number
感谢
答
这应该工作:
where @number =
case ISNUMERIC(@number)
when 1 then cast([TransactioniD] as varchar(200))
else cast([TransactionDomainGuid] as varchar(200))
end
编辑追加投。演员必须在CASE内部; SQL Server要求案例的所有路径产生相同的变量类型。
答
你应该避免这样的构造,而是有两个疑问,一个WHERE TRANSACTIONID和一个WHERE TransactionDomainGuid:
if ISNUMERIC(@number)
select * from IntegrationIDTransactions
where [TransactioniD] = @number
else
select * from IntegrationIDTransactions
else [TransactionDomainGuid] = @number
更妙的是,在客户端做的IF并调用相应的查询。在你的例子中编写查询是一个性能杀手,结果是不可纠正的,并且通常会创建这两个个案的最差执行计划。
+0
+1,如果性能有任何问题,这里是唯一正确的方法。 – Dane 2009-08-20 07:41:21
对不起仍然得到错误: 消息206,级别16,状态2,行4 操作数类型冲突:唯一标识符是与INT 不相容的尝试: DECLARE @number为nvarchar(200) 组@number =' 5' SELECT * FROM IntegrationIDTransactions 其中@number =情况ISNUMERIC(@number) 当1然后[TRANSACTIONID] 别的[TransactionDomainGuid] 端 – Sreedhar 2009-08-20 06:41:48
右键,它需要在第一壳体分支的类型,并假定所有分支产生那种类型。编辑答案。 Remus Rusanu的答案会顺便表现得更好。 – Andomar 2009-08-20 08:46:23
再次感谢Andomar。 – Sreedhar 2009-08-20 21:52:20