Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75

Входные параметры NULL

09.09.2013, 19:03. Показов 1886. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! В процедуре есть 4 входных параметра Id , которые могут быть NULL, и если NULL то тогда производить выборку по всем Id. тогда нужно убрать условие по данному параметру в select , то есть чтобы выборка производилась полностью по всем Id.
по началу пришла в голову мысль, что нужно записать так: "if @id is null begin select .... end" и так для каждого условия.
но потом сразу же стало понятно, что таких комбинаций будет 14 штук, и каждый раз вставлять запрос с новым условием плохой вариант. Мне подсказали нужно попробовать с помощью динамического запроса.
Я пытался разобраться , что это такое, но так и не понял как это реализовать в моем случае.

Есть 1 запрос, большой. и есть 4 входных параметра, например id улицы - может быть NULL, тогда для всех.

Подскажите, пожалуйста!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2013, 19:03
Ответы с готовыми решениями:

Входные параметры с перечислением
Привет всем! Нужно сделать процедуру с входными параметрами , с такой задачей. Например: id дома может быть null, если null тогда для...

Входные параметры
Помогите за плюсик: использовать входные параметры функций со способом передачи данных “по значению”; Можно какой нить пример?

Входные параметры запроса
Нужно сделать запрос, по полям из формы. Но проблема в том, что если поле пустое, запрос не выводит записи. Как сделать если поле пустое...

10
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
09.09.2013, 20:01
SQL
1
WHERE ([id улицы] IS NULL OR [id улицы]=@idулицы) AND ...
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
09.09.2013, 20:07  [ТС]
нет, если входной параметр NULL нужно выборку из базы проводить по всем улицам.
0
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
09.09.2013, 20:09
Немножко ошибся:
SQL
1
WHERE (@idулицы IS NULL OR [id улицы]=@idулицы) AND ...
1
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 11:07  [ТС]
ок, спасибо, завтра утром попробую. на самом деле все очень просто получается... только вот я не знаю как себя поведет запрос, если значение будет null, будет ли выборка по всем улицам при таком условии.

Добавлено через 14 часов 43 минуты
Цитата Сообщение от Serpentariy Посмотреть сообщение
Немножко ошибся:
SQL
1
WHERE (@idулицы IS NULL OR [id улицы]=@idулицы) AND ...
к сожалению при такой записи он выводит все данные по этому id даже если входные данные не NULL... : (
SQL
1
2
3
4
5
WHERE @DATE = ast.Date_Start AND @DATE = sf.Date_Fromd AND
      stt.ID IS NULL OR stt.ID IN (SELECT id FROM @SettlementID_table) AND
      s.ID IS NULL OR s.ID IN (SELECT id FROM @StreetsID_table) AND
      hs.ID IS NULL OR hs.ID IN (SELECT id FROM @HousesID_table) AND
      rs.ID IS NULL OR rs.ID IN (SELECT id FROM @ServiceID_table)
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.09.2013, 11:38
Цитата Сообщение от SpiritAbsolute Посмотреть сообщение
к сожалению при такой записи он выводит все данные по этому id даже если входные данные не NULL... : (
Код SQL
Потому что скобки нужно расставлять. Думаете они в примере для мебели?
1
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 12:01  [ТС]
Сделал так, все равно выводит все данные, даже если входные не null ...
SQL
1
2
3
4
5
WHERE @DATE = ast.Date_Start AND @DATE = sf.Date_Fromd AND
      (stt.ID IS NULL) OR (stt.ID IS NOT NULL AND stt.ID IN (SELECT id FROM @SettlementID_table)) AND
      (s.ID IS NULL) OR (s.ID IS NOT NULL AND s.ID IN (SELECT id FROM @StreetsID_table)) AND
      (hs.ID IS NULL) OR (hs.ID IS NOT NULL AND hs.ID IN (SELECT id FROM @HousesID_table)) AND
      (rs.ID IS NULL) OR (rs.ID IS NOT NULL AND rs.ID IN (SELECT id FROM @ServiceID_table))
Добавлено через 12 минут
вот так тоже не работает...
SQL
1
2
3
4
5
WHERE @DATE = ast.Date_Start AND @DATE = sf.Date_Fromd AND
      (stt.ID IS NULL AND stt.ID = stt.ID) OR (stt.ID IS NOT NULL AND stt.ID IN (SELECT id FROM @SettlementID_table)) AND
      (s.ID IS NULL AND s.ID = s.ID) OR (s.ID IS NOT NULL AND s.ID IN (SELECT id FROM @StreetsID_table)) AND
      (hs.ID IS NULL AND hs.ID = hs.ID) OR (hs.ID IS NOT NULL AND hs.ID IN (SELECT id FROM @HousesID_table)) AND
      (rs.ID IS NULL AND rs.ID = rs.ID) OR (rs.ID IS NOT NULL AND rs.ID IN (SELECT id FROM @ServiceID_table))
Добавлено через 5 минут
SQL
1
2
3
4
5
WHERE
      (stt.ID IS NULL OR stt.ID IN (SELECT id FROM @SettlementID_table)) AND
      (s.ID IS NULL OR s.ID IN (SELECT id FROM @StreetsID_table)) AND
      (hs.ID IS NULL OR hs.ID IN (SELECT id FROM @HousesID_table)) AND
      (rs.ID IS NULL OR rs.ID IN (SELECT id FROM @ServiceID_table))
Вот так вот получилось, стало выводить нужные данные, если входные параметры указаны. но когда входное значение NULL выборки не происходит.
0
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
10.09.2013, 12:13
А где у Вас в крайнем примере хоть один параметр?
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 12:16  [ТС]
T-SQL
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
27
28
29
@Date datetime = '01.01.2012',
@SettlementID varchar(max) = '16',
@StreetsID varchar(max) = '172, 184',
@HousesID varchar(max) = '95, 4066',
@ServicesID varchar(max) = '5, 6, 7, 10'
 
as
 
-- Объявление таблицы для выходных данных
declare @table_pos table (id bigint identity(1, 1), [Адрес] varchar, [Участок] varchar, 
[Услуга] varchar, [Ед измерения] varchar, [Тариф] float, [Норматив] float, 
[Поставщик] varchar, [Количество ЛС] int)
 
declare @SettlementID_table table (id int)   --- объявление таблицы для хранения id населенных пунктов
declare @StreetsID_table table (id int)   --- объявление таблицы для хранения id улиц
declare @HousesID_table table (id int)   --- объявление таблицы для хранения id домов
declare @ServiceID_table table (id int)   --- объявление таблицы для хранения id услуг
 
 
while CHARINDEX(',',@HousesID) != 0
begin
set @HousesID = RTRIM(LTRIM(@HousesID))
insert into @HousesID_table
select CAST(SUBSTRING(@HousesID,0,CHARINDEX(',',@HousesID)) as int)
 
select @HousesID = RIGHT(@HousesID,LEN(@HousesID)-CHARINDEX(',',@HousesID))
end
 
insert into @HousesID_table select CAST(NULLIF(@HousesID,'') as int)
вот так вот получается, и потом в условии я как бы получаю разные id из таблицы

SQL
1
2
3
4
5
WHERE
      (stt.ID IS NULL OR stt.ID IN (SELECT id FROM @SettlementID_table)) AND
      (s.ID IS NULL OR s.ID IN (SELECT id FROM @StreetsID_table)) AND
      (hs.ID IS NULL OR hs.ID IN (SELECT id FROM @HousesID_table)) AND
      (rs.ID IS NULL OR rs.ID IN (SELECT id FROM @ServiceID_table))
0
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
10.09.2013, 12:27
SQL
1
2
3
4
5
WHERE (@DATE IS NULL OR @DATE = ast.Date_Start AND @DATE = sf.Date_Fromd) AND 
      (@SettlementID IS NULL OR stt.ID IN (SELECT id FROM @SettlementID_table)) AND
      (@StreetsID IS NULL OR s.ID IN (SELECT id FROM @StreetsID_table)) AND
      (@HousesID IS NULL OR hs.ID IN (SELECT id FROM @HousesID_table)) AND
      (@ServiceID IS NULL OR rs.ID IN (SELECT id FROM @ServiceID_table))
1
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 13:19  [ТС]
когда ввожу какому нибудь параметру значение null , не происходит выборки, результат просто пустые названия колонок. хотя только сегодня утром, я пробовал, все получалось без этих условий когда было вот так
SQL
1
2
3
4
stt.ID IN (SELECT id FROM @SettlementID_table) AND
      s.ID IN (SELECT id FROM @StreetsID_table) AND
      hs.ID IN (SELECT id FROM @HousesID_table) AND
      rs.ID IN (SELECT id FROM @ServiceID_table)
а сейчас опять пытаюсь, точно так же и не получается, странность какая то

Добавлено через 4 минуты
действительно, причем тут блин stt.id когда речь идет о входных параметрах.... сейчас все приведу в божеский вид, опробую четко все варианты по новой и отпишусь.

Добавлено через 19 минут
в общем! вроде бы все работает правильно теперь, входные параметры null принимаются и выполняется выборка по всем, улицам, домам и т.д. спасибо!
но когда все null, запрос очень долгий. по всем четырем параметрам он до сих пор выполняется...
у меня вот такой запрос большой, и походу он еще и кривоватый. мб его попробовать разбить как то?

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT stt.Name +' '+ s.Name +' '+ hs.Number AS 'Адрес', d.name AS 'Участок', rs.Name AS 'Услуга', mu.Name AS 'Ед.Измерения', ast.cost AS 'Тариф', sf.Specific AS 'Норматив', sup.Name AS 'Поставщик', COUNT(r.id) AS 'Количество ЛС'
FROM cpay.reciever r
    JOIN cpay.access ass ON r.id = ass.[owner]
        LEFT JOIN Auxiliary.TariffesTypes att ON ass.ID_TariffesTypes = att.ID_ServiceSubtypes
                LEFT JOIN [REFERENCES].Suppliers sup ON att.ID_Suppliers = sup.ID
        LEFT JOIN Auxiliary.ServiceTariffes ast ON att.ID = ast.ID_TariffesTypes
          JOIN [REFERENCES].[Services] rs ON ass.ID_Service = rs.ID
             JOIN Auxiliary.ServiceSubtypes asbt ON rs.ID = asbt.ID_Service
                JOIN [REFERENCES].Specifications sf ON asbt.id = sf.ID_Subtype
             JOIN [REFERENCES].[MeasureUnits] mu ON rs.ID_MeasureUnits = mu.id
    LEFT JOIN [REFERENCES].[Districts] d ON r.id_district = d.ID
    JOIN Common.Flats f ON r.ID_Flat = f.ID
    JOIN Common.Entrances e ON f.[OWNER] = e.ID 
    JOIN Common.Houses hs ON e.[OWNER] = hs.ID
    JOIN Common.Buildings b ON hs.[OWNER] = b.ID
    JOIN Common.Streets s ON b.[OWNER] = s.ID
    JOIN Common.Settlements stt ON s.[OWNER] = stt.ID
Добавлено через 27 минут
запрос кривой жесть, надо что то с ним делать. количество лицевых счетов считается не правильно, и много лишних строк...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2013, 13:19
Помогаю со студенческими работами здесь

Входные и выходные параметры функции
Здравствуйте! Пытаюсь разобраться в объявлении функции, подскажите пожалуйста, если у меня есть метод генерирующий массив и метод...

Нужно ли постоянно проверять входные параметры
После языков со строгой типизацией, не могу понять дао питона. сейчас я постоянно проверяю в функциях а тот ли параметр мне передали....

Запретить изменять входные параметры в методе
Добрый день, задался вопросом, а возможно ли запретить изменять входные параметры в методе? Запретить изменять поля класса можно добавив...

Входные и выходные параметры процедуры в IBExpert
Здравствуйте! Подскажите пожалуйста, куда входят входные параметры процедуры в IBExpert? И куда выходят выходные?

Как сделать чтобы программа отображала входные параметры самостоятельно
Всем привет! Нужно написать программу. В центре будет изображена 3д модель. а по бокам будет показаны входные данные, на которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru