Синтаксис CASE внутри предложения WHERE на MSSQL - PullRequest
2 голосов
/ 23 апреля 2011

У меня следующий синтаксис SQL на MSSQL

SELECT
  id,
  firstName,
  lastName
FROM
  Person
WHERE
  ((CASE WHEN @Filter = 'firstName' THEN @Value END) = firstName ) or
  ((CASE WHEN @Filter = 'lastName' THEN @Value END) = lastName ) 

Это работает, но я не знаю, есть ли лучший и более эффективный способ сделать это.

Заранее спасибо Имя

Ответы [ 2 ]

8 голосов
/ 25 апреля 2011

В этом примере вам вообще не нужно CASE.AND и OR будут работать быстрее:

SELECT
  id,
  firstName,
  lastName
FROM
  Person
WHERE
  (@Filter = 'firstName' AND @Value = firstName) OR
  (@Filter = 'lastName' AND @Value = lastName)
5 голосов
/ 23 апреля 2011

Это может скомпилироваться, но кажется, что чего-то не хватает.@Filter, по-видимому, представляет поле , по которому вы фильтруете, и можно было бы увидеть значение для проверки по полю, например,

SELECT
  id,
  firstName,
  lastName
FROM
  Person
WHERE @Value =
   CASE WHEN @Filter = 'firstName' THEN firstName
        WHEN @Filter = 'lastName' THEN lastName
    END

Если это ваше намерение, то требуется только одно выражение CASE, независимо от количества возможных полей фильтра.

В любом случае, оператор CASE будет очень эффективным.SQL Server увидит, что выражения WHEN сравнивают скалярные значения и соответственно оптимизируют (другими словами, значение @Filter не нужно пересматривать для каждой строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...