У меня есть таблица с большим (> 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>
Спасибо