Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
SpiritAbsolute
4 / 4 / 1
Регистрация: 07.08.2013
Сообщений: 75
1

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

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

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

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

Подскажите, пожалуйста!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 19:03
Ответы с готовыми решениями:

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

Отбор NULL значений без использования "IS NULL"
Всем привет! Может кто-нибудь подсказать, как переписать запрос: select * from @t where Age...

Исходные, входные и выходные данные
Друзья мне нужна Ваша помощь,почему у меня неувязки в исходных,входных и выходных данных? Вроде бы...

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

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

10
Serpentariy
106 / 102 / 43
Регистрация: 09.07.2013
Сообщений: 199
09.09.2013, 20:01 2
SQL
1
WHERE ([id улицы] IS NULL OR [id улицы]=@idулицы) AND ...
0
SpiritAbsolute
4 / 4 / 1
Регистрация: 07.08.2013
Сообщений: 75
09.09.2013, 20:07  [ТС] 3
нет, если входной параметр NULL нужно выборку из базы проводить по всем улицам.
0
Serpentariy
106 / 102 / 43
Регистрация: 09.07.2013
Сообщений: 199
09.09.2013, 20:09 4
Немножко ошибся:
SQL
1
WHERE (@idулицы IS NULL OR [id улицы]=@idулицы) AND ...
1
SpiritAbsolute
4 / 4 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 11:07  [ТС] 5
ок, спасибо, завтра утром попробую. на самом деле все очень просто получается... только вот я не знаю как себя поведет запрос, если значение будет 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
invm
2131 / 1398 / 447
Регистрация: 02.06.2013
Сообщений: 3,513
10.09.2013, 11:38 6
Цитата Сообщение от SpiritAbsolute Посмотреть сообщение
к сожалению при такой записи он выводит все данные по этому id даже если входные данные не NULL... : (
Код SQL
Потому что скобки нужно расставлять. Думаете они в примере для мебели?
1
SpiritAbsolute
4 / 4 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 12:01  [ТС] 7
Сделал так, все равно выводит все данные, даже если входные не 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
Serpentariy
106 / 102 / 43
Регистрация: 09.07.2013
Сообщений: 199
10.09.2013, 12:13 8
А где у Вас в крайнем примере хоть один параметр?
0
SpiritAbsolute
4 / 4 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 12:16  [ТС] 9
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
Serpentariy
106 / 102 / 43
Регистрация: 09.07.2013
Сообщений: 199
10.09.2013, 12:27 10
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
4 / 4 / 1
Регистрация: 07.08.2013
Сообщений: 75
10.09.2013, 13:19  [ТС] 11
когда ввожу какому нибудь параметру значение 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
10.09.2013, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2013, 13:19

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru