Очистка 3 вложенных SQL `IF..ELSE` с проверкой, если значение равно NULL, для использования в` WHERE ... AND` - PullRequest
0 голосов
/ 10 января 2019

У меня есть таблица с большим (> 50) количеством столбцов. Я пишу хранимую процедуру, где пользователь хочет передать (среди других параметров) 3 необязательных параметра для фильтрации набора данных. Обычно мой код будет выглядеть как

IF @value1 IS NULL
   IF @value2 IS NULL
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
   ELSE
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
ELSE
   IF @value2 IS NULL
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
   ELSE
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT

но это кажется загроможденным и очень сложным для подражания, тем более что WITH относительно велика.

С другой стороны,

IF @value1 IS NULL AND
   @value2 IS NULL AND
   @value3 IS NULL
   WITH..SELECT
ELIF @value1 IS NULL AND
   @value2 IS NULL AND
   WITH..SELECT
ELIF ...
   WITH..SELECT
ELIF ...
   WITH..SELECT
...

более читабельно, но намного медленнее. Есть ли более чистый способ сделать это?

IFs влияют только на часть WITH, но я не могу поместить IF в WITH. Кроме того, единственное использование полей, если не NULL, это ограничение через WHERE col1 = @value1 и т. Д.

Есть ли более чистый способ сделать это? Вот пример WITH, используемый при наличии всех значений:

WITH trans AS
(
    SELECT *
      FROM myTable
     WHERE myKey = '12345'
       AND col1  = @value1
       AND col2  = @value2
       AND col3  = @value3
)
SELECT *
  FROM trans
 WHERE <additional criteria not dependent on @values>

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вот способ, которым я нашел, чтобы очистить код.

Мы пишем общее предложение WHERE, которое выглядит как

 WHERE myKey = '12345'
   AND (@value1 IS NULL OR col1 = @value1)
   AND (@value2 IS NULL OR col2 = @value2)
   AND (@value3 IS NULL OR col3 = @value3)

и тогда вложенные IF не нужны вообще.

0 голосов
/ 10 января 2019

Вариант использования в предложении where. Один случай с несколькими, когда потом будет делать. Другой грубый способ может быть таким:

  DECLARE  @value1 as nvarchar(max),
         @value2 as nvarchar(max),
         @value3 as nvarchar(max)

declare @whereClause as nvarchar(max) = Select case when @value1 is null and @value2 IS NULl and @value3 is null then 'where clause 1'
                                                    when @value1 is null and @value2 IS NOT NULl and @value3 is NOT null then 'where clause 2'
                                                    else ''

используйте это предложение where. Я бы выкопал больше для лучшего пути. Но самое простое было бы это

...