Member 14164414 Ответов: 1

Sql : у меня есть требование, где все мои входные параметры optional.so я должен проверить, являются ли входные параметры null или notnull


скажем, у меня есть 4 параметра в качестве входных данных
clientid,провайдер,статус и timeinterval
если все параметры равны нулю, то я верну все записи из таблицы
если clientid=22 и другие параметры равны нулю, то будут возвращены записи с clientid=22
если клиент =22 и поставщик =ХХХ тогда записи идентификатора ClientID =22 и поставщик =XXX будет возвращен

Может ли кто-нибудь сформулировать sql-запрос с вышеуказанными условиями
Пожалуйста помочь
Заранее спасибо

Что я уже пробовал:

если параметр ClientID=функция isnull, поставщик = функция isnull ,статус=функция isnull ,timeinterval=функция isnull затем select * from имя_таблицы инструкции elseif параметр ClientID=notnull,поставщик = notnull, статус=notnull ,timeinterval=функция isnull затем выберите параметр ClientID=@ClientID таким образом,поставщик=@поставщик,статус=@поставщик

точно так же я должен написать еще много комбинаций, есть ли другой способ получить его ?

1 Ответов

Рейтинг:
1

OriginalGriff

Это даже не допустимый SQL...
Делайте их по одному за раз:

IF @ClientID IS NULL THEN
   BEGIN
   -- check the others.
   IF @Provider IS NULL AND @Status IS NULL AND @TimeInterval IS NULL THEN
      SELECT * FROM MyTable
   ELSE
      ...
   END
ELSE
   BEGIN
   IF @ClientID = 22 THEN
      ...
   END


Member 14164414

Если @ClientID имеет значение NULL, то
НАЧАТЬ
-- проверьте остальных.? ( нужно ли мне проверять и другие параметры)
Если @Provider имеет значение null и @статус null и @TimeInterval-это то нуль
Выбрать * из mytable
ЕЩЕ
...
КОНЕЦ
ЕЩЕ
НАЧАТЬ
Если @ClientID = 22, то
...
КОНЕЦ

OriginalGriff

Прочти еще раз ...

Member 14164414

извините понял я очень новичок в sql

Member 14164414

в другом состоянии, что мне нужно проверить ?

OriginalGriff

Вы знаете, каковы ваши правила - и я подозреваю, что вы дали нам только очень малую их часть.
Таким образом, в первом ELSE вы начинаете обрабатывать случаи, когда ClientID равен null, но по крайней мере один из других-нет. У нас нет доступа к вашим правилам, поэтому мы не можем сделать все это за вас!

Member 14164414

Он будет иметь следующие входные параметры:
1.Клиент OUID: чтобы получить плату за конкретного клиента
2.поставщик: чтобы получить плату за конкретного поставщика
3.TimeInterval: для получения начислений за определенный временной интервал (т. е. для получения начислений с расчетным периодом с сентября 2018 года по февраль 2019 года этот параметр будет равен 201809_201902)
4.статус: получить заряды с определенным статусом (т. е. только “открытые” записи)

Все параметры являются необязательными. Они будут использоваться для фильтрации собираемых записей, и их можно использовать в комбинации (т. е. получить запись для конкретного клиента и определенного временного интервала).
это мое требование

Member 14164414

НАЧАТЬ

SET @sql = 'SELECT * FROM acp_pending_charges_info where (1=1)'

если @ClientOUID не равен null
установите @sql = @sql+ 'и (ClientOUID = @ClientOUID)'

если @Provider не равен null
набор @среда SQL = @SQL, с+ ' А (поставщик = @поставщик)'

если @Status не равен null
набор @среда SQL = @SQL, С + и (статус = @статус)'

если @TimeInterval не равен null
установите @sql = @sql + ' и (TimeInterval = @TimeInterval)'

EXEC(@sql)
КОНЕЦ


сработает ли это ?

но мой вопрос заключается в том ,что если мой clientid равен нулю, а остальные параметры не равны нулю, то в этом состоянии я должен кадрировать как?

OriginalGriff

1) "сработает ли это"?
2) "А что, если мой ... Это ваши правила, а не мои, и ваш кодекс должен отражать эти правила; я понятия не имею, что это за правила!

Richard Deeming

Это близко - вам просто нужно использовать процедуры sp_executesql[^] для передачи параметров в динамический запрос:

DECLARE @sql nvarchar(max);
SET @sql = N'SELECT * FROM acp_pending_charges_info where (1=1)'
if @ClientOUID is not null set @sql = @sql + N' And (ClientOUID = @ClientOUID)'
if @Provider is not null set @sql = @sql + N' And (Provider = @Provider)'
if @Status is not null set @sql = @sql + N' And (Status = @Status)'
if @TimeInterval is not null set @sql = @sql + N' And (TimeInterval = @TimeInterval)'

DECLARE @params nvarchar(max);
SET @params = N'@ClientOUID int, @Provider varchar(50), @Status bit, @TimeInterval varchar(10)';
-- TODO: Specify the correct data types and sizes in the @params string above.

EXEC sp_executesql @sql, @params, @ClientOUID = @ClientOUID, @Provider = @Provider, @Status = @Status, @TimeInterval = @TimeInterval;