Мне поручено получить количество записей, которые попадают во время начала и время окончания, в то время как возможно фильтруются по @aircraftId, @instructorId и @reservationId (поэтому он игнорирует себя при подсчете). Все три параметра могут принимать значение NULL, поэтому они могут передаваться или не передаваться, поэтому запрос должен будет фильтроваться на основе их наличия или отсутствия. Я могу сделать это с помощью динамического Sql, но я предпочитаю избегать этого, главным образом потому, что отладка будет утомительна для тех, кто будет иметь дело с этим позже.
Возможно ли это (я предполагаю, что это возможно) в одном запросе? Или это одна из тех ситуаций, когда мне приходится брать набор и сокращать его с другими параметрами, если они присутствуют?
SELECT COUNT(*)
FROM AVMAN.Reservation
WHERE ( @aircraftid IS NULL
OR ( @aircraftid IS NOT NULL
AND AircraftId = @aircraftid
)
)
OR ( @InstructorId IS NULL
OR ( @InstructorId IS NOT NULL
AND InstructorUserId = @InstructorId
)
)
AND ( ( -- start during the range
StartTime >= @StartTime
AND StartTime < @EndTime
)
OR ( -- end during the range
EndTime > @StartTime
AND EndTime <= @EndTime
)
OR ( -- start before the range and end after it
StartTime < @StartTime
AND EndTime > @EndTime
)
)
AND ( @ReservationId IS NULL
OR ( ReservationId IS NOT NULL
AND ReservationId = @ReservationId
)
)
@aircraftid IS NULL OR ( @aircraftid IS NOT NULL AND AircraftId = @aircraftid)
До:@aircraftid IS NULL OR AircraftId = @aircraftid
- person joshhendo   schedule 01.09.2015