2009-08-20 156 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