|
|
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, вот недавно видел ответ на мой вопрос, но найти через Поиск не смог. Вопрос в следующем, как в зависимости от переданных значений выбирать одним запросом, т.е. 1) если @id1 IS NULL AND id2 IS NULL - все записи 2) @id2 IS NULL - только c указанным Id1 3) @id1 IS NULL - только c указанным Id2 4) только c указанными Id1 и id2 CREATE PROCEDURE [dbo].[p_get] @id1 INT = NULL, @id2 INT = NULL AS SET NOCOUNT ON SELECT FROM tbl WHERE id1=@id1 AND id2=@id2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 15:45:14 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 15:49:16 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
спасиб! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 15:51:32 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
2Alexes Ваш запрос не будет работать т.к. Ваше условие Код: plaintext означает выбирать записи где id1 равно значению или id1 нулевое и где id2 равно значению или id2 нулевое. Т.е. если оба параметра нулевые, то записей в выборке не будет, т.к. id обычно нулевыми не делают 2новичок Я в таких случаях пишу три запроса и исполняю в зависимости от переданных значений. При больших количествах входных параметрах, например штук 6, количество вариантов становится равным факториал 6 и написать это трудно :). Выход из этой ситуации, динамический запрос. Но так как штука эта весьма специфичная, то я просто говорю нашим программистам чтоб интерфейс программы меняли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 16:03:56 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
2 fima в защиту Alexes Посмотрите внимательнее, перед id1 и id2 в запросе стоят такие маленькие значёчки @ , что говорит о том, что на нулл проверяются не ключи а параметры процедуры. А вот советовать программистам менять интерфейс программы, лишь потому, что вам трудно написать запрос, не советую, могут сгоряча и побить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 16:14:04 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Приношу извинения Alexes, и правда ведь работает, а я вот не додумался до такого, снимаю шляпу :)). А воевать с прикадниками уже привычно :)) то номера строк им выводи, то процедуру с переменным числом параметров... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 16:17:48 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
2 fima В случае переменного числа параметров можно также воспользоваться техникой, описанной Alexes ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 16:25:11 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Я об этом подробно писал, но тоже не нашел по "поиску" Вместо CASE лучше использовать Where field=isnull(@param,field) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 21:39:40 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Вот, предполагаемое FAQ /* Необходимо написать процедуру для выборки данных, в которой некоторые критерии отбора не принимались во внимание, если пользователь не ввел для них значения. Приведенная ниже процедура делает отбор по следующим критериям: pubdate больше или равно @pubdateStart; pubdate меньше или равно pubdateEnd; в title содержится строка @title; price больше или равно @price; ytd_sales равно @ytd_sales; Для сравнения дат используются минимально и максимально возможные значения DateTime. Предполагается, что поле Price не может быть меньше нуля. В реальной программе это может быть и другая константа. В дюбом случае можно использовать минимальное или максимальное значение для выбранного типа данных. */ --Начало кода Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2002, 19:18:22 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
To Cat2 : Я бы все-таки посоветовал использовать конструкцию Код: plaintext 1. вместо Код: plaintext 1. Действительно, во втором случае будет использован индекс на id, но у меня, например, тестирование показало, что первый вариант в большинстве случаев быстрее. Хотя лучше всего взять реальные данные и протестировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2002, 23:10:27 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Для ura. Может быть. Действительно, только опыт является критерием истины. У меня всегда быстрее отрабатывает isNULL Факу я написал Наверное надо это туда добавить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 00:08:30 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Поднимал я уже эту проблему, оба решения имеют недостатки. В любом случае индекс будет использоваться. Только план выполнения запроса чаще будет на оптимальным. Скорее всего быстрее будет динамический запрос. Предлагаю подискутировать на эту тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 09:55:56 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
По-дискутировать, конечно можно, но только есть ли смысл? Разумееется, на одних наборах данных быстрее будет одно, а на других - другое. Вряд ли удасться дать совет, вроде "При числе записей более 100000, полей больше 10 и таблиц больше 5 используйте то-то, а если таблиц больше 10 - то-то". А вот в факу решение с динамиком внести надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2002, 07:15:26 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
В том то и вопрос, что для 2 параметров и 1000 строк в таблице может и не важно. А вот если критереев поиска около 10 и строк в таблице под 1000 000. Тут действительно сложно сказать, но думаю динамический запрос побыстрее будет. Хотя надо на практике проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2002, 09:57:54 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Для lvv. Тута столько тестов провести надо, на разных таблах, что волосы дыбом встают. Да и на одной вариантов тьма. Я так думаю, что если полей много, а в отборе обычно участвует 2-3, то лучше справится динамик, а если из 20 в отборе задействуются 18, то скорее всего дело свдется к пошлому сканированию во всех вариантах. Да и с проектированием индексов тоже всякие проблемы. Если база редкоизменяемая, то хоть по всем полям индексы строй, а если это реалтайм диагностический комплекс с сотней датчиков? Нет, надо конкретную таблу смотреть, да еще хорошо бы статистику знать, какие поля при отборе самые популярные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2002, 20:42:06 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Для Cat2 Согласен, но обычно у меня такая задача возникает в различных формах поиска и тогда в запросе не одна таблица. Например таблица адресов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как тогда в таком случае поступать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 09:08:08 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
есть у меня одна процедурка которая принимает на вход 4 параметра каждый из которых может быть нулевым. По этим параметрам строится запрос, при этом каждый параметр ставит условие на 4 колонки со связкой по ИЛИ. Я использовал динамический запрос, но прочтя этот топик решил проэксперементировать с ISNULL. Так вот динамика работает в среднем на 15% быстрее, хотя код во втором случае гораздо меньше да и читается лучше. Вот вам и результат теста. База небольшая ~ 25000 записей, индексы не используются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 10:52:28 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Ответ простой. Если ваша модель безопасности позволяет использовать динамический запрос - используйте! Если же доступ к таблицам закрыт от пользователя, то вариант (для ленивых :) один - джойн по всем таблицам, которые могут появиться в условии и вере по условиям в виде (id=@Id or @Id is NULL) или (id=IsNull(@Id,id)). Хотя есть ещё вариант предлагаемый fima, использовать статические запросы в процедуре, но тогда кол-во вариантов становится равным факториал кол-ва параметров что не радует. Хотя если его слегка модифирировать и применить средство для автоматической генерации запросов то он может тоже быть интересен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 11:29:11 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Для Nickolay, согласен что менее красиво. А индексы не использовать все же не хорошо :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 11:50:14 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
Для akuz Есть проблема с безопасностью, можно попробовать обойти эту проблему создаваю View по таблице и на нее уже навешивать права ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 11:53:56 |
|
||
|
Select с переменным количеством в WHERE
|
|||
|---|---|---|---|
|
#18+
2lw: индексов не использую потому что это View на уже работающей базе, а для создания индексированного View надо бы базу пересоздать :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 12:37:48 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32053758&tid=1819908]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 339ms |

| 0 / 0 |
