Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > MS SQL Server > Различные where в зависимости от параметра. |
Автор: KuMa1104 16.3.2012, 16:31 | ||
Здравствуйте такой вопрос. В хранимую процедуру поступает параметр @parResolutionDateOper который может принимать значения 1. Equals 2. Not Equals 3. Is Before 4. Is After На основе этого параметра в SQL должно быть использовано одно из условии 1. WHERE data = @parResolutionDateStart 2. WHERE data <> @parResolutionDateStart 3. WHERE data < @parResolutionDateStart 4. WHERE data > @parResolutionDateStart как это красиво реализовать? Сейчас сделал так
Есть какой ни будь более красивый способ? |
Автор: Akina 16.3.2012, 17:24 |
CASE |
Автор: Zloxa 16.3.2012, 18:56 |
Написать четыре разных запроса. Для вас это может оказаться удивительно, но в общем случае это так. Для всех четырех типов запросов может быть построен разный план. Три их них могут оказаться достаточно эффективными. Один, для отбора по неравенству, эффективным быть не может в принципе. Для одного же запроса на все четыре случая план будет выстроен одинаково не эффективный для каждого из случаев, а потому запросы стоит объединять в один только в частном случае, когда надежд построить эффективный план для трех других запросов - нет или же производительность не имеет значения. Добавлено через 11 минут и 9 секунд Можно, кстати написать не четыре, а один запрос, объединив четыре по union all. ![]() |
Автор: Zloxa 17.3.2012, 23:14 | ||||
Тогда составлять текст запроса динамически ![]() Но динамика это плохо. Но лучше чем один запрос на все случаи жизни
Оптимизатору будет проще построить эффективный план такого запроса. Трансформировать исходный запрос через or к этому виду, оптимизатор, мне думается, на современном этапе развития, самостоятельно врядли сможет. В случае если ResolutionDate индексирован, первый подзапрос сможет использовать этот индекс, второй - нет. В случае, если условия записаны через OR оптимизатор, наверняка выберет полное сканирование таблицы. В случае с union, наверняка первый подзапрос будет искать по индексу, второй фуллсканить. Однако в случае если @parResolutionDateOper != 'Does Not Equal', хоть второй подзапрос никуда не делся из плана, выполняться он, наверняка, не станет. Получается запрос через юнинон будет фуллсканить только когда это действительно надо, а не всякий раз. |
Автор: KuMa1104 18.3.2012, 12:22 | ||
Именно так они сейчас и устроены. Это очень не удобно сопровождать и отлаживать, а кроме того как я понимаю Exec(@SQL) не кеширует запрос поэтому это работает медленнее.
Спасибо за объяснение, не знал такого! |