JOJ
踏踏实实做人,认认真真做事!放纵自己就是毁灭自己!

在Sqlserver中的CASE我很少用到, 但是我认为他比较强大,用的好的可以简化很多操作! 他相当于C#里面的 Switch , 一些逻辑判断可以提到SQL中去处理,而不再C#里面来处理.

方式1.  固定比较值

SELECT TOP 10
        OrderID ,
        OrderID % 10 AS 'Last Digit' ,
        POSITION = CASE OrderID % 10
                     WHEN 1 THEN 'First'
                     WHEN 2 THEN 'Second'
                     WHEN 3 THEN 'Third'
                     WHEN 4 THEN 'Fourth'
                     ELSE 'Something else'
                   END
FROM    dbo.Orders

 

相当于:

switch (OrderID % 10)
        {
            case 1:
                POSITION = "First";
                break;
            //code  2.3.4 ...
            default:
                POSITION = "Something else";
                break;
        }

 

 

 

方式2.  比较值通过计算,使用表里面的其他字段

SELECT TOP 10
        OrderID % 10 AS 'Last Digit' ,
        ProductID ,
        "How Close?" = CASE orderId % 10
                         WHEN ProductID THEN 'Exact Match!'
                         WHEN ProductID - 1 THEN 'Within -1'
                         WHEN ProductID + 1 THEN 'Within +1'
                         ELSE CAST(Quantity AS NVARCHAR(MAX)) --使用其他列Quantity
                       END
FROM    dbo.[Order Details]
WHERE   ProductID < 10
ORDER BY OrderID DESC
 
方式3. 注意CASE 后面没有了表达式 , 注意和上面比较
/*
    case 后面么有了表达式
    When 后面必须为bool 类型
    好?处?:每?个?when的?比?较?条?件?都?可?以?完?全?由?你?来?控?制? 2中?case 后?面?的?表?达?式?固?定?
    
*/
SELECT TOP 10
        OrderID % 10 AS 'Last Digit' ,
        ProductID ,
        "How Close?" = CASE WHEN ProductID % 2 = 0 THEN N'偶?数?'
                            WHEN ABS(OrderID % 10 - ProductID) <= 1
                            THEN 'Within +1'
                            ELSE CAST(Quantity AS NVARCHAR(MAX)) --使?用?其?他?列?Quantity
                       END
FROM    dbo.[Order Details]
WHERE   ProductID < 10
ORDER BY OrderID DESC
 

场景:商场里面打折(涨价)后价格一般喜欢为49,75,95这样的数字结尾! 下面几个示例

涨价后的价格 实际标价
$10.13 $10.49
$17.57 $17.75
$79.99 $79.95

1. 0.49以下的为0.49

2.0.49~0.75 为0.75

3.0.75以上的为0.95

思路:

嵌套if…else可以实现上面需求, 但是当规则更复杂的时候,代码将很难读懂,必须使用游标(游标我不熟悉)来实现代码并且每次都要检验每一行代码。

使用CASE语句试一试

USE Northwind
GO

DECLARE @Markup MONEY ;
DECLARE @Muliplier MONEY ;
SET @Markup = 0.10 ;
 --涨价% , 如果涨价为%,20% 只需要在这里修改即可
SET @Muliplier = @Markup + 1 ;
 --涨价后的百分比

SELECT TOP 10
        ProductName ,
        UnitPrice ,
        UnitPrice * @Muliplier AS '价格' ,
        "新价格" = CASE WHEN FLOOR(UnitPrice * @Muliplier + 0.24) > FLOOR(UnitPrice
                                                              * @Muliplier)
                           THEN FLOOR(UnitPrice * @Muliplier) + 0.95
                           WHEN FLOOR(UnitPrice * @Muliplier + 0.5) > FLOOR(UnitPrice
                                                              * @Muliplier)
                           THEN FLOOR(UnitPrice * @Muliplier) + 0.75
                           ELSE FLOOR(UnitPrice * @Muliplier) + 0.49
                      END
FROM    dbo.Products
ORDER BY ProductID DESC
以下为结果:

 

 

 

 

 

 

 

 

 

 

 

以上知识参考: 《SQL Server2005编程入门经典(第二版)》

 

Technorati 标签: T-Sql,CASE

posted on 2010-07-31 15:20  JoinJ  阅读(5140)  评论(0编辑  收藏  举报