Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Различные where в зависимости от параметра. 
:(
    Опции темы
KuMa1104
Дата 16.3.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 

как это красиво реализовать? Сейчас сделал так

Код

       (@parResolutionDateOper = 'Equals' AND ResolutionDate = @parResolutionDateStart )
    OR
    (@parResolutionDateOper = 'Does Not Equal' AND ResolutionDate <> @parResolutionDateStart)
    OR
    ......................... аналогично


Есть какой ни будь более красивый способ?

Это сообщение отредактировал(а) KuMa1104 - 16.3.2012, 16:33


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Akina
Дата 16.3.2012, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



CASE


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 16.3.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(KuMa1104 @  16.3.2012,  17:31 Найти цитируемый пост)
Есть какой ни будь более красивый способ?

Написать четыре разных запроса.

Для вас это может оказаться удивительно, но в общем случае это так. Для всех четырех типов запросов может быть построен разный план. Три их них могут оказаться достаточно эффективными. Один, для отбора по неравенству, эффективным быть не может в принципе. Для одного же запроса на все четыре случая план будет выстроен одинаково не эффективный для каждого из случаев, а потому запросы стоит объединять в один только в частном случае, когда надежд построить эффективный план для трех других запросов - нет или же производительность не имеет значения.

Добавлено через 11 минут и 9 секунд
Можно, кстати написать не четыре, а один запрос, объединив четыре по union all.  smile 


Это сообщение отредактировал(а) Zloxa - 16.3.2012, 19:02


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
KuMa1104
Дата 17.3.2012, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Спасибо за ваши ответы.
Цитата(Akina @  16.3.2012,  17:24 Найти цитируемый пост)
CASE 

В SQL нельзя написать конструкцию вида
Код

Select * from DT
where Case  @parResolutionDateOper 
    WHEN 'Equals' THEN DT.ResolutionDate = @parResolutionDateStart 
    WHEN 'Does Not Equal'  THEN DT.ResolutionDate <> @parResolutionDateStart 

поэтому это здесь не применимо. Если знаете какой то другой способ как это сделать то будьте добры расскажите будет интересно посмотреть.


Цитата(Zloxa @  16.3.2012,  18:56 Найти цитируемый пост)
Написать четыре разных запроса.

к сожалению не предоставляется возможным так как помимо @parResolutionDateOper в запросах присутствует несколько подобных фильтров например (@parExceptionDateOper, @parItemDate ...) а значит число запросов будет огромно. 4*4*4

Цитата(Zloxa @  16.3.2012,  18:56 Найти цитируемый пост)
Можно, кстати написать не четыре, а один запрос, объединив четыре по union all.   

Если не сложно поясните как это выглядит и дает ли какие то преимущества. 


Цитата(Zloxa @  16.3.2012,  18:56 Найти цитируемый пост)
Для всех четырех типов запросов может быть построен разный план. Три их них могут оказаться достаточно эффективными.
 Можете посоветовать какую ни будь литературу про то как строить эффективные планы запросов. Опыт в написании и оптимизации запросов не богат, так что почитаю с интересом)))




Это сообщение отредактировал(а) KuMa1104 - 17.3.2012, 19:35


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Zloxa
Дата 17.3.2012, 23:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(KuMa1104 @  17.3.2012,  20:33 Найти цитируемый пост)
к сожалению не предоставляется возможным так как помимо @parResolutionDateOper в запросах присутствует несколько подобных фильтров например (@parExceptionDateOper, @parItemDate ...) а значит число запросов будет огромно. 4*4*4

Тогда составлять текст запроса динамически smile
Но динамика это плохо. Но лучше чем один запрос на все случаи жизни


Цитата(KuMa1104 @  17.3.2012,  20:33 Найти цитируемый пост)
Если не сложно поясните как это выглядит 

Код

Select * from DT
where @parResolutionDateOper = 'Equals' and DT.ResolutionDate = @parResolutionDateStart 
union all
Select * from DT
where @parResolutionDateOper = 'Does Not Equal' and DT.ResolutionDate <> @parResolutionDateStart 

Цитата(KuMa1104 @  17.3.2012,  20:33 Найти цитируемый пост)
и дает ли какие то преимущества. 

Оптимизатору будет проще построить эффективный план такого запроса. Трансформировать исходный запрос через or к этому виду, оптимизатор, мне думается, на современном этапе развития, самостоятельно врядли сможет.

В случае если ResolutionDate  индексирован, первый подзапрос сможет использовать этот индекс, второй - нет. В случае, если условия записаны через OR оптимизатор, наверняка выберет полное сканирование таблицы. В случае с union, наверняка первый подзапрос будет искать по индексу, второй фуллсканить. Однако в случае если @parResolutionDateOper != 'Does Not Equal', хоть второй подзапрос никуда не делся из плана, выполняться он, наверняка, не станет. Получается запрос через юнинон будет фуллсканить только когда это действительно надо, а не всякий раз.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
KuMa1104
Дата 18.3.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Цитата(Zloxa @  17.3.2012,  23:14 Найти цитируемый пост)
Тогда составлять текст запроса динамически

Именно так они сейчас и устроены. Это очень не удобно сопровождать и отлаживать, а кроме того как я понимаю Exec(@SQL) не кеширует запрос поэтому это работает медленнее.

Цитата(Zloxa @  17.3.2012,  23:14 Найти цитируемый пост)
В случае если ResolutionDate  индексирован, первый подзапрос сможет использовать этот индекс, второй - нет. В случае, если условия записаны через OR оптимизатор, наверняка выберет полное сканирование таблицы. В случае с union, наверняка первый подзапрос будет искать по индексу, второй фуллсканить. Однако в случае если @parResolutionDateOper != 'Does Not Equal', хоть второй подзапрос никуда не делся из плана, выполняться он, наверняка, не станет. Получается запрос через юнинон будет фуллсканить только когда это действительно надо, а не всякий раз. 


Спасибо за объяснение, не знал такого!



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.