`
mfhappy
  • 浏览: 38177 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SQL中的select case when

阅读更多

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 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集

我根据这个例子在我程序中也写了个类似的sql语句:

select * from jjy_PrivateBuilding_info order by l1,
case
when l1=0 then 'name'
when l1<>0 then 'id'
else 'pbbh'
end
go

项目中用的是hibernate中的hql语句,我就不写出来了。

现在问题是:上面的查询结果和select * from jjy_PrivateBuilding_info order by l1的结果是一样的,这是为什么呢??很是不解。我对select case when的理解是:我感觉这个case when then 应该和java程序中的if条件判断一样才对,when后面的表达式相对于java程序中的if条件,而then 后面的值相对于执行if语句后的值(这只是我个人理解,如理解有偏差请不要笑话哦,希望得到更好的解释)。但是现在出现了这种结果,我觉得是when then 没有起作用。

分享到:
评论

相关推荐

    case when和sum case when 写法及拼接字段

    1 case when 写法 2 sum case when 用法 3 select 拼接字段 示例如下: when 2 then 'C' else 'D' end ) as '类型',count(*) as '数量' from table group by orderType

    SQL__case_when_then_的用法

    SQL__case_when_then_的用法

    sql 中 case when 语法使用方法

    例如,下面的语句显示中文年月 代码如下: select getdate() as 日期,case month(getdate()) when 11 then ‘十一’ when 12 then ‘十二’ else substring(‘一二三四五六七八九十’, month(getdate()),1) end+’月...

    SqlServer使用 case when 解决多条件模糊查询问题

    我们在进行项目开发中,经常会遇到多条件模糊...最近写数据库存储过程的时候经常使用case when 语句,正好可以用这个语句解决一下以上问题。以SQL中的NorthWind数据库为例,我要操作的是其中的Employees表,该表中默认

    SQL集合函数中case when then 使用技巧

    我们都知道SQL中适用case when then来转化数据库中的信息 比如 select (case sex when 0 then '男' else '女' end) AS sex from studentInfo

    格式化SQL中的SELECT字段

    将SQL中的SELECT字段列表格式化成每个字段占一行的形式,例如: 处理前: case when aaa then bbb else ccc end, ddd 处理后: case when aaa then bbbelse ccc end, ddd 工具的使用方法: 1. in.txt表示...

    sql中case语句的用法浅谈

    SQL中Case的使用方法 Case具有两种格式。简单Case函数和Case搜索函数。 代码如下:–简单Case函数 CASE sex  WHEN ‘1’ THEN ‘男’  WHEN ‘2’ THEN ‘女’ ELSE ‘其他’ END –Case搜索函数 CASE WHEN sex = ...

    sqlserver中Case的使用方法(上下篇)第1/2页

    代码如下: –简单Case函数 CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘2’ THEN ‘女’ ELSE ‘其他’ END –Case搜索函数 CASE WHEN sex = ‘1’ THEN ‘男’ WHEN sex = ‘2’ THEN ‘女’ ELSE ‘其他’ END 这两种...

    SQL语句将行转换成列

    select @sql = @sql + ',sum(case 地区 when '''+地区+''' then 数量 end) ['+地区+']' + ',sum(case 地区 when '''+地区+''' then 比率 end) [比率]' from (select distinct 地区 from 表) as a select @sql...

    SQL 基础--SELECT 查询

    在SQL*Plus中, 你要用一个分号结束每个SQL 语句.(;) 三、SQL*PLUS特征: 字符日期左对齐 数字右对对齐 列名默认大写 SQL PLUS 自己的命令不需以分号“;”结束 四、SQL查询时,数字和日期类型的数据可用...

    用于生成数据字典的SQL语句

    /*SQL Server数据库字典(查询所有的表结构)*/ SELECT TOP 100 PERCENT --a.id, CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名, CASE WHEN a.colorder = 1 THEN isnull(f.value, '') ELSE '' END AS ...

    sqlserver对字段出现NULL值的处理

    代码如下: -判断某些字段是否为空 –case select case when ‘字段名’ is null then ‘\N’ else convert(varchar(20),’字段名’) end as ‘NewName’ select case when null is null then ‘\N’ else convert...

    SQL Server高级内容之case语法函数概述及使用

    1.Case函数的用法 (1)使用类似:switch-case与if-else if。 (2)语法: case [字段] when 表达式 then 显示数据 when 表达式...2)执行的SQL语句是: 代码如下: Select ID,TestBase, Case When testBase&gt;=90 then ‘A’

    MySQL 的CASE WHEN 语句使用说明

    mysql数据库中CASE WHEN语句。 case when语句,用于计算条件列表并返回多个可能结果表达式之一。 CASE 具有两种格式: 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 CASE 搜索函数计算一组布尔...

    sql2000查看数据库表结构.sql

    主键 = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in ( SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND ...

    2012 SQL常用操作

    SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分 ,100 * SUM(CASE WHEN C# = '001' AND score &gt;= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C#...

    ..sql查询更新多表

    select (case when a&gt;b then a else b end), (case when b&gt;c then b else c end) from table_name 用B数据库的字段替换A数据库的字段 update table set content = b.content from 数据库B.table b where b.ID = ...

    sqlserver 中时间为空的处理小结

    二、如何在sql语句中判断为NULL的时间字段 假设表为:TestTable SN DateTime1 DateTime2 1 2011-10-24 2011-10-25 2 NULL 2011-10-26 3 2011-10-25 NULL 用case进行查询,若写成: select (case DateTime1 ...

    SQL Server 备份永久脚本

    实现sqlserver自动备份, select @数据库文件大小=cast((convert (dec (15,2),sum(convert(bigint,case when status & 64 = 0 then size else 0 end))) + convert (dec (15,2),sum(convert(bigint,case when status ...

Global site tag (gtag.js) - Google Analytics