2009-08-20 100 views
1

如何根据传递值过滤条件中的列。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 

感谢

回答

4

这应该工作:

where @number = 
    case ISNUMERIC(@number) 
     when 1 then cast([TransactioniD] as varchar(200)) 
     else cast([TransactionDomainGuid] as varchar(200)) 
    end 

编辑追加投。演员必须在CASE内部; SQL Server要求案例的所有路径产生相同的变量类型。

+0

对不起仍然得到错误: 消息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

+0

右键,它需要在第一壳体分支的类型,并假定所有分支产生那种类型。编辑答案。 Remus Rusanu的答案会顺便表现得更好。 – Andomar 2009-08-20 08:46:23

+0

再次感谢Andomar。 – Sreedhar 2009-08-20 21:52:20

2

你应该避免这样的构造,而是有两个疑问,一个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