Polar_bear |
Отправлено: 26.04.2005, 12:02 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
Всем привет, вопрос такой
Пишу хранимую процедуру. Там огромное количество входных параметров. Но вот в чем штука некоторые параметры могуть быть равны NULL некоторые 0, и процедура такие параметры должна игнорировать. В процедура рабочий код вот такого вида
CODE |
Select * from TableName
where @Var1=Var_Table and
where @Var2=Var_Table2...
|
и так далее. Вот как бы сделать так чтобы проверить значения параметров и игнорировать если они NULL или 0
|
|
olegenty |
Отправлено: 26.04.2005, 12:12 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
есть варианты:
1. DSQL — плохой вариант
2. Ветвистое дерево всех вариантов — тоже плохой вариант: замучаешься его писАть
3. применение isnull — для строковых параметров это поможет, только придётся заменить "=" на "like" — опять плохой вариант, не будут использоваться индексы, вместо seek в плане получишь scan
4. комбинация вышеупомянутых способов.
в общем, думай сам. я бы ещё и логически побил на ряд процедур. которые бы объединялись этой большой.
а вообще, сходи на SQL.RU, возможно, там что-то ещё подскажут.
|
|
AVC |
Отправлено: 26.04.2005, 12:59 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
Там огромное количество входных параметров. Но вот в чем штука некоторые параметры могуть быть равны NULL некоторые 0, и процедура такие параметры должна игнорировать.
|
Лично я в таких случаях стараюсь использовать DSQL, но разрешать его на уровне клиента (значительно проще отлаживать, да и возможностей у C больше).
Если плевать на скорость и всякие оптимизации можно воспользоваться IsNull, Like.
Вот несколько приемов (синтаксис Oracle)
Select ...
Where ID = NVL(:pID, ID) — вернет все строки если параметр pID не заполнен или только те, где id = pID если заполнен
Select ...
Where NVL(ID, невозможное_значение) = :pID — вернет все строки где ID is Null если параметру присвоено невозможное_значение
Оба варианта в одном
NVL(ID, невозможное_значение) = NVL(:pID, NVL(ID, невозможное_значение))
Эти варианты плохи тем, что для построения выборки нужно просмотреть все строки таблицы или подзапроса.
|
|
xim |
Отправлено: 26.04.2005, 14:25 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
SQL | Select * from TableName where isnull(@Var1,0)=case isnull(@Var1,0) when 0 then 0 else Var_Table end and ...
|
|
|
Guest |
Отправлено: 26.04.2005, 14:30 |
|
Не зарегистрирован
|
Всем спасибо. Моментально реагируете. Решение принял. Тему можно закрыть |
|
Polar_bear |
Отправлено: 26.04.2005, 14:32 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
Забыл залогиниться, сорри Это сверху я писал
|
|