Оператор case всегда пропускается в ELSE в хранимой процедуре

Я пытаюсь использовать оператор CASE во время вставки в хранимую процедуру SQL следующим образом:

INSERT INTO [dbo].[OfferPrice]
            (OfferId,Price,DefaultPrice,SalePrice,
             SaleFromDate,SaleToDate)
SELECT tvp.OfferId   AS OfferId,
       CASE
         WHEN @Price IS NOT NULL THEN @Price
         WHEN @Price IS NULL
              AND tvp.SalePrice IS NOT NULL
              AND Getutcdate() >= tvp.SaleFromDate
              AND Getutcdate() < tvp.SaleToDate THEN tvp.SalePrice
         WHEN @Price IS NULL
              AND tvp.SalePrice IS NULL THEN tvp.DefaultPrice
         ELSE 0
       END AS Price,
       tvp.DefaultPrice AS DefaultPrice,
       tvp.SalePrice AS SalePrice,
       tvp.SaleFromDate AS SaleFromDate,
       tvp.SaleToDate AS SaleToDate
FROM   @OfferPriceTVP tvp
       LEFT JOIN [dbo].OfferPrice dop
              ON dop.OfferId = tvp.OfferId
WHERE  dop.OfferId IS NULL 

Проблема в том, что CASE всегда пропускает ELSE, даже если предыдущие утверждения верны. Что я делаю неправильно?

РЕДАКТИРОВАТЬ:

Это @OfferPriceTVP:

CREATE TYPE [dbo].[TVP_OfferPrice] AS TABLE
(
    OfferId INT NOT NULL PRIMARY KEY, CountryId INT NOT NULL, VatRateId INT, DefaultPrice decimal(16, 4), SalePrice decimal(16, 4),
    SaleFromDate datetime, SaleToDate datetime
);

И вот вставка, которую я пытался сделать сейчас (хотя даты отсутствуют, он должен установить цену по умолчанию, верно?):

DECLARE @OfferPriceTVP AS [dbo].[TVP_OfferPrice]
INSERT INTO @OfferPriceTVP (OfferId,CountryId,VatRateId,DefaultPrice,SalePrice,SaleFromDate,SaleToDate)
VALUES (10006805,2,1,1,1,NULL,NULL),
(10006806,1,1,2,1,NULL,NULL),
(10006807,1,1,3,1,NULL,NULL),
(10006808,1,1,4,1,NULL,NULL),
(10006809,1,1,5,1,NULL,NULL),
(10006810,1,1,6,2,NULL,NULL);
EXEC [dbo].[TVP_OfferPrice] @OfferPriceTVP;
GO

2 ответа

Решение

Сравнения с NULL всегда ложны. Ваша таблица не содержит дат продаж. Проверка периода продаж

Getutcdate() >= tvp.SaleFromDate AND Getutcdate() < tvp.SaleToDate

всегда потерпит неудачу

Это означает, что если @Price NULL и SalePrice не только ELSE заявление является действительным.

Я думаю, возможно, что ваше намерение, если нет дат продажи, состоит в том, чтобы взять либо цену продажи (если имеется), либо цену по умолчанию.

Если это так, то просто опустите SalePrice IS NULL проверьте в третьем WHEN и использовать COALESCE:

   CASE
     WHEN @Price IS NOT NULL THEN @Price
     WHEN @Price IS NULL
          AND tvp.SalePrice IS NOT NULL
          AND Getutcdate() >= tvp.SaleFromDate
          AND Getutcdate() < tvp.SaleToDate THEN tvp.SalePrice
     WHEN @Price IS NULL
          THEN COALESCE(tvp.SalePrice,tvp.DefaultPrice)
     ELSE 0
   END AS Price
Другие вопросы по тегам