2009-08-20 7 views
1

Как фильтровать столбцы, в которых условие основано на значении передано.Условие в Where Clause - SQL Server

Ex:

declare @number nvarchar(200) 
set @number = '2ddafa3' 

Здесь @number может быть ИНТ или uniqueIdentifer

так в том, где положение, как я могу достичь чего-то, как показано ниже.

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 

Edited добавить гипс. Литой должен быть внутри CASE; SQL-серверу требуется, чтобы все пути в случае создавали один и тот же тип переменной.

+0

К сожалению ошибка все еще получает: Msg 206, уровень 16, состояние 2, строка 4 типа Операнда столкновения: UniqueIdentifier несовместима с ИНТОМ Пробовал с: объявляют @number NVARCHAR (200) множества @number = ' 5' выберите * из IntegrationIDTransactions где @number = случай ISNUMERIC (@number) когда 1 Тогда [TransactionID] еще [TransactionDomainGuid] конца – Sreedhar

+0

справа, он принимает вид первого случая отрасли и предполагает, что все отрасли производства этот тип. Отредактировал ответ. Ответ Ремуса Русану, между прочим, будет лучше. – Andomar

+0

Еще раз спасибо Andomar. – Sreedhar

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