zoukankan      html  css  js  c++  java
  • CASE WHEN

    2、项目中,联系人详细信息这一个页面中,联系人的性别在数据库字段的保存,男的用0表示,女的用1表示,所以,如果直接就读出来绑定到DataList中,性别就显示成0或1了。所以需要将Sql语句进行改造。先看看我原先的做法,这样做,组长叫我重做了,要叫我要CASE WHEN来写。

        不用CASE WHEN 的做法。源代码如下:

    string sql="select * from CONTACTPERSON ,CUSTOMER where CONTACTPERSONID='"+strContactid+"' and CONTACTPERSON.CUSTOMERID=CUSTOMER.CUSTOMERID";
    DataSet ds=new DataSet();
    ds=Common.GetDSCommon(sql);  

    if(ds.Tables[0].Rows[0]["CONTACTPERSONSEX"].ToString()=="0")
       {
        ds.Tables[0].Rows[0]["CONTACTPERSONSEX"]="男";
       }
       else
       {
                    ds.Tables[0].Rows[0]["CONTACTPERSONSEX"]="女";
       }

    使用CASE WHEN做法。

    string sql="select CUSTOMER.*,CONTACTPERSON.CONTACTPERSONNAME,CONTACTPERSON.CONTACTPERSONBIRTHDAY,CONTACTPERSON.CONTACTPERSONPOSITION,CONTACTPERSON.CONTACTPERSONDEPTNAME,";
       sql+="CONTACTPERSON.TELEPHONE,CONTACTPERSON.MAIL,CONTACTPERSON.CITY,CONTACTPERSON.PROVINCE,CONTACTPERSON.POSTCODE,CONTACTPERSON.COUNTRY,CONTACTPERSON.MEMO,";
       sql+="CONTACTPERSON.DIRECTOR,";
       
        sql+="case when CONTACTPERSON.CONTACTPERSONSEX = '0'then '男' when CONTACTPERSON.CONTACTPERSONSEX= '1' then '女' end as CONTACTPERSONSEX from CUSTOMER ,CONTACTPERSON where CONTACTPERSONID='"+strContactid+"' and CONTACTPERSON.CUSTOMERID=CUSTOMER.CUSTOMERID";
       可以看出这样明显加长了,SQL语句,这样做有什么好处呢?

    3、SQL条件控制(case when...then...else...end)

    我的语句:(SQL 2000)
    1:
    select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime)) else DATEDIFF(day,ComeInTime,getdate()) end as test
    from myUser where DelFlag='0' and UserID='cq'
    2:
    select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已离职)' end as test
    from myUser where DelFlag='0' and UserID='cq'
    3:
    select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已离职)'
    else DATEDIFF(day,ComeInTime,getdate()) end as test
    from myUser where DelFlag='0' and UserID='cq'

    为什么1 和2 执行都没有问题,3 却报“将 varchar 值 ' 480(已离职)' 转换为数据类型为 int 的列时发生语法错误。”


    select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已离职)'
    else str(DATEDIFF(day,ComeInTime,getdate())) end as test
    from myUser where DelFlag='0' and UserID='cq'
    这样试一下.语法应该没有问题

    4、WHEN THEN
    WHEN THEN
    ELSE
    END
    --------------
    select count(*) as ct , CASE
    WHEN (Pro_state= 1) THEN '待审'
    WHEN (Pro_state= 2) THEN '已审'
    WHEN (Pro_state= 3) THEN '办理中'
    WHEN (Pro_state= 4) THEN '已申退'
    WHEN (Pro_state= 5) THEN '来信'
    WHEN (Pro_state= 6) THEN '办理完成'  
    WHEN (Pro_state= 7) THEN '未予立案'  
    end as pro_state
    from vw_proposals_query where 1=1 GROUP BY   pro_state

    结果:
    ct   pro-state
    30   办理中
    7    来信
    1   办理完成
    5   未予立案

    解读:
    查询总数和pro_state 当 Pro_state= 1 时以 '待审' 替代表示
                       当 Pro_state= 2 时以 '已审' 替代表示
                       当 Pro_state= 3 时以 '办理中' 替代表示
                       。。。。。。

    5、CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。

    首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下:

    SELECT <myColumnSpec> =
    CASE
    WHEN <A> THEN <somethingA>
    WHEN <B> THEN <somethingB>
    ELSE <somethingE>
    END

    在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:

    USE pubs
    GO
    SELECT
        Title,
        'Price Range' =
        CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
        END
    FROM titles
    ORDER BY price
    GO

    这是 CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE:

    SELECT 'Number of Titles', Count(*)
    FROM titles
    GROUP BY
        CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
        END
    GO

    你甚至还可以组合这些选项,添加一个 ORDER BY 子句,如下所示:

    USE pubs
    GO
    SELECT
        CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
        END AS Range,
        Title
    FROM titles
    GROUP BY
        CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
        END,
        Title
    ORDER BY
        CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
        END,
        Title
    GO

    注意,为了在 GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。

    除了选择自定义字段之外,在很多情况下 CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。

     


    ISNULL
    使用指定的替换值替换 NULL。

    语法
    ISNULL ( check_expression , replacement_value )

    参数
    check_expression

    将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

    replacement_value

    在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。

    返回类型
    返回与 check_expression 相同的类型。

    注释
    如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。

    示例
    A. 将 ISNULL 与 AVG 一起使用
    下面的示例查找所有书的平均价格,用值 $10.00 替换 titles 表的 price 列中的所有 NULL 条目。

    USE pubs
    GO
    SELECT AVG(ISNULL(price, $10.00))
    FROM titles
    GO

    下面是结果集:

    --------------------------
    14.24                     

    (1 row(s) affected)

    B. 使用 ISNULL
    下面的示例为 titles 表中的所有书选择书名、类型及价格。如果一个书名的价格是 NULL,那么在结果集中显示的价格为 0.00。

    USE pubs
    GO
    SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type,
    ISNULL(price, 0.00) AS Price
    FROM titles
    GO

    C. 在Full Join情况下使用ISNULL
    表A:
    tid
    uid
    anum

    表B:
    tbid
    uid
    bnum1
    bnum2
    需要通过uid全连接两个表:
    select a.tid,a.uid,a.anum,b.bnum1,b.bnum2 from a full join b on a.uid=b.uid
    全连接会有很多为空的情况,可以使用ISNull来解决,改为:
    select isnull(a.tid,b.tid),isnull(a.uid,b.uid),isnull(a.anum,0),isnull(b.bnum1,0),isnull(b.bnum2,0) from a full join b on a.uid=b.uid

    前部分引用SQL参考手册(一直漂注)


    select
    (case
             when isn %2=0 then '自办营业厅'
             else
                'bb自办营业厅'
             end
    ) as b,
    COUNT(*)
       from jb_zjm
       group by 
            
             (case
             when isn %2=0 then '自办营业厅'
             else
                'bb自办营业厅'
             end

             

  • 相关阅读:
    java。多态
    java。构造方法
    java.final修饰符l
    java。this的用法
    数据库:内连接与外连接区别
    Java工具类-设置字符编码
    Java工具类-验证码工具
    Java工具类-加密算法
    java中的object... args参数
    针对MySql封装的JDBC通用框架类(包含增删改查、JavaBean反射原理)
  • 原文地址:https://www.cnblogs.com/superstar/p/1871631.html
Copyright © 2011-2022 走看看