Вместо того, чтобы использовать -1 для обозначения того, что вы не знаете или не заботитесь, как насчет использования Null для этого? Довольно многое, для чего это было сделано. Затем вы можете переключиться на бит, а не на Int.
Кроме того, я уверен, что TomTom не согласится, но я думаю, что использование оператора CASE - это способ пойти на этот материал.
Ваш пробег может отличаться, но кажется, что механизм запросов обрабатывает его намного лучше, чем обертывание вещей в IsNull или наличие нескольких операторов OR, которые могут стать довольно запутанными, когда вы начинаете добавлять другие условия.
Независимо от того, в какую сторону вы планируете, план выполнения будет немного страдать в зависимости от того, что вы проходите, но это не должно быть ужасным.
Дополнительная выгода от использования операторов CASE заключается в том, что вы можете добавить немного сложности без особого кода (в отличие от множества предложений OR). Кроме того, первое условие, соответствующее вашим критериям, может предотвратить дополнительные оценки, что не всегда имеет место при работе с OR ...
Итак, для 8 необязательных параметров с -1, поскольку значение используется для игнорирования поиска , что вы в конечном итоге с что-то вдоль линий:
WHERE
@Search1 = CASE WHEN @Search1 = -1 THEN @Search1 ELSE @Column1 END
AND @Search2 = CASE WHEN @Search2 = -1 THEN @Search1 ELSE @Column2 END
AND @Search3 = CASE WHEN @Search3 = -1 THEN @Search1 ELSE @Column3 END
AND @Search4 = CASE WHEN @Search4 = -1 THEN @Search1 ELSE @Column4 END
AND @Search5 = CASE WHEN @Search5 = -1 THEN @Search1 ELSE @Column5 END
AND @Search6 = CASE WHEN @Search6 = -1 THEN @Search1 ELSE @Column6 END
AND @Search7 = CASE WHEN @Search7 = -1 THEN @Search1 ELSE @Column7 END
AND @Search8 = CASE WHEN @Search8 = -1 THEN @Search1 ELSE @Column8 END
ПРИМЕЧАНИЕ: Как отметил К., метод NULL дотягивает, если столбцы вы работаете волю потенциально могут иметь значения NULL, так как NULL = NULL не будет правильно оцениваться. Поэтому, для удовольствия, я изменил свой ответ на то, что запросил исходный плакат, который должен использовать свой собственный идентификатор для пропусков поиска.
да. к сожалению, более 8 случаев - 8! случаях, которые будут запросом монстра. – TomTom
@TomTom, один оператор 'CASE' для каждого параметра. Я не вижу проблемы. –
Использование мозга? это 8 параметров, NOone говорит, что ONLY ONE нежелательно. Один не имеет значения? 8 комбинаций. 2 нерелевантно? 3 нерелевантно? Это намного больше, чем 8 разных случаев. – TomTom