![]() |
|
Модераторы: Akina |
![]()
|
|
| KuMa1104 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Здравствуйте такой вопрос.
В хранимую процедуру поступает параметр @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 как это красиво реализовать? Сейчас сделал так
Есть какой ни будь более красивый способ? Это сообщение отредактировал(а) KuMa1104 - 16.3.2012, 16:33 -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
CASE
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
Написать четыре разных запроса. Для вас это может оказаться удивительно, но в общем случае это так. Для всех четырех типов запросов может быть построен разный план. Три их них могут оказаться достаточно эффективными. Один, для отбора по неравенству, эффективным быть не может в принципе. Для одного же запроса на все четыре случая план будет выстроен одинаково не эффективный для каждого из случаев, а потому запросы стоит объединять в один только в частном случае, когда надежд построить эффективный план для трех других запросов - нет или же производительность не имеет значения. Добавлено через 11 минут и 9 секунд Можно, кстати написать не четыре, а один запрос, объединив четыре по union all. Это сообщение отредактировал(а) Zloxa - 16.3.2012, 19:02 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| KuMa1104 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Спасибо за ваши ответы.
В SQL нельзя написать конструкцию вида
поэтому это здесь не применимо. Если знаете какой то другой способ как это сделать то будьте добры расскажите будет интересно посмотреть. к сожалению не предоставляется возможным так как помимо @parResolutionDateOper в запросах присутствует несколько подобных фильтров например (@parExceptionDateOper, @parItemDate ...) а значит число запросов будет огромно. 4*4*4
Если не сложно поясните как это выглядит и дает ли какие то преимущества.
Это сообщение отредактировал(а) KuMa1104 - 17.3.2012, 19:35 -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
||||||
|
|||||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
Тогда составлять текст запроса динамически Но динамика это плохо. Но лучше чем один запрос на все случаи жизни
Оптимизатору будет проще построить эффективный план такого запроса. Трансформировать исходный запрос через or к этому виду, оптимизатор, мне думается, на современном этапе развития, самостоятельно врядли сможет. В случае если ResolutionDate индексирован, первый подзапрос сможет использовать этот индекс, второй - нет. В случае, если условия записаны через OR оптимизатор, наверняка выберет полное сканирование таблицы. В случае с union, наверняка первый подзапрос будет искать по индексу, второй фуллсканить. Однако в случае если @parResolutionDateOper != 'Does Not Equal', хоть второй подзапрос никуда не делся из плана, выполняться он, наверняка, не станет. Получается запрос через юнинон будет фуллсканить только когда это действительно надо, а не всякий раз. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| KuMa1104 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Именно так они сейчас и устроены. Это очень не удобно сопровождать и отлаживать, а кроме того как я понимаю Exec(@SQL) не кеширует запрос поэтому это работает медленнее. Спасибо за объяснение, не знал такого! -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |