首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Case语句总是跳到存储过程中的ELSE语句。

Case语句总是跳到存储过程中的ELSE语句。
EN

Stack Overflow用户
提问于 2015-01-13 08:05:10
回答 2查看 656关注 0票数 0

在插入sql存储过程期间,我试图使用CASE语句,如下所示:

代码语言:javascript
复制
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 

问题是,即使前面的语句是正确的,大小写也总是跳到别处。我做错了什么?

编辑:

这是@OfferPriceTVP:

代码语言:javascript
复制
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
);

在这里,我现在想要做的插入(即使没有日期,它应该设定默认价格,对吗?):

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-13 08:23:45

将其与NULL进行比较总是错误的。您的表中没有销售日期。销售周期检查

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

永远都会失败。

这意味着,如果@Price是NULL,而SalePrice不是,那么只有ELSE语句是有效的。

票数 0
EN

Stack Overflow用户

发布于 2015-01-13 08:25:38

我认为,也许,如果没有销售日期,你的意图是要么采取销售价格(如果有)或默认价格。

如果是这样的话,那么只需在第三个WHEN中省略WHEN签入并使用COALESCE

代码语言:javascript
复制
   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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27917429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档