Вложенные случаи where в SQL серверных хранимых процедур - PullRequest
0 голосов
/ 28 мая 2020
CREATE PROCEDURE dbo.sample @start DATE,@end DATE,@type VARCHAR(5)
AS
    SELECT o.O_Id,
           o.Sale_Price,
           o.Private_Band,
           c.Date_of_Purchase,
           c.Date_Redeemed,
           c.Type,
           c.Points_Issued,
           o.Date_of_Purchase
    FROM Order_Details o,
         Transaction_Historys c
    WHERE CASE
               WHEN o.Date_of_Purchase BETWEEN @start AND @end
                AND (c.Type = @type) THEN 1
               WHEN c.Type = @type THEN 1
               ELSE 0
          END = 1
GO
EXECUTE dbo.sample @type=NULL,@start='2012-03-01',@end='2012-03-30'
GO

Когда я тестирую с @type=null, я не получаю данных. Мне нужно обработать менее двух случаев, когда условие

INput CASE1=wen @type is NULL-> WHERE c.Date_Redeemed BETWEEN @Start AND @End-- this should execute
If CASE2=wen @start,@end is NULL->WHERE c.Type=@type-- this should execute

1 Ответ

1 голос
/ 28 мая 2020

переписать:

WHERE
   o.Date_of_Purchase BETWEEN @start AND @end OR
   c.Type = @type OR
   (@type IS NULL and @start is null)
  • Установить тип как null, а начало / конец как ненулевое, чтобы выполнить поиск по дате
  • Установить начало / конец как null и ввести как ненулевое значение выполните поиск типа
  • Задайте тип и начните как null, чтобы получить все записи. Если вы хотите БЕЗ ЗАПИСЕЙ, удалите OR (@type IS NULL and @start is null)

Как я уже сказал, только IS NULL может использоваться для возврата true при работе с нулями. Если @start имеет значение null, то o.Date_of_Purchase BETWEEN @start AND @end всегда будет ложным, поэтому вместо него будет использоваться @type. То же самое для @type - null, тогда будет использоваться @ start / @ end. Если оба равны нулю, то первые два условия всегда ложны, поэтому вам просто нужно решить, что делать, если оба равны нулю. Вам также может потребоваться другое поведение, если все данные предоставлены, и в этом случае вы можете посмотреть на явное:

WHERE
   (c.Type = @type AND o.Date_of_Purchase BETWEEN @start AND @end) OR
   (@start IS NULL AND c.Type = @type) OR
   (@type IS NULL and o.Date_of_Purchase BETWEEN @start AND @end) OR
   (@start IS NULL AND @type IS NULL)

В этом

  • , если оба предоставлены, возвращаются только строки, в которых тип и дата совпадают,
  • , если тип не указан, используется дата,
  • , если дата не указана, используется тип и
  • если ничего не указано все строки возвращаются. Чтобы строки не возвращались, удалите последний предикат
...