Встроенные операторы If в SQL - PullRequest
0 голосов
/ 12 июля 2010

Я хочу сделать что-то вроде этого:

DECLARE @IgnoreNulls = 1;

SELECT Col1, Col2
FROM tblSimpleTable
IF @IgnoreNulls
BEGIN
  WHERE Col2 IS NOT NULL
END
ORDER BY Col1 DESC;

Идея состоит в том, чтобы в некотором роде использовать PHP / ASP.NET, только фильтровать NULL, если пользователь пожелает. Возможно ли это в T-SQL? Или нам нужен один большой блок IF, например, так:

IF @IgnoreNulls
BEGIN
  SELECT Col1, Col2
  FROM tblSimpleTable
  WHERE Col2 IS NOT NULL
  ORDER BY Col1 DESC;
END
ELSE
BEGIN
  SELECT Col1, Col2
  FROM tblSimpleTable
  ORDER BY Col1 DESC;
END

Ответы [ 3 ]

4 голосов
/ 12 июля 2010

Вы можете сделать это следующим образом:

SELECT Col1, Col2
FROM tblSimpleTable
WHERE ( @IgnoreNulls != 1 OR Col2 IS NOT NULL )
ORDER BY Col1 DESC
3 голосов
/ 12 июля 2010

Динамическое изменение поисков на основе заданных параметров - сложная тема, и выполнение одного способа по другому, даже с очень небольшим отличием, может иметь серьезные последствия для производительности.Ключ в том, чтобы использовать индекс, игнорировать компактный код, игнорировать беспокойство по поводу повторения кода, вы должны составить хороший план выполнения запроса (используйте индекс).

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

Условия динамического поиска в T-SQL by Erland Sommarskog

1 голос
/ 12 июля 2010

В целом (если таблица невелика), лучший способ - выделить случаи и сделать что-то похожее на ваш вопрос.

IF (@IgnoreNulls = 1)
BEGIN
  SELECT Col1, Col2
  FROM tblSimpleTable
  WHERE Col2 IS NOT NULL
  ORDER BY Col1 DESC;
END
ELSE
BEGIN
  SELECT Col1, Col2
  FROM tblSimpleTable
  ORDER BY Col1 DESC;
END

С меньшей вероятностью это вызовет проблемы с суб.оптимальные планы запросов кэшируются.

...