`

hql使用CASE系列表达式

阅读更多

6.2.2 使用CASE系列表达式

CASE表达式是一个表达式,不是控制语句。也就是说,它返回某个数据类型的值。因为SQL是说明性的,所以不像其他语言中的CASE语句那样可以修改控制流。但是新手们不理解表达式和语句之间的差别,这种程序员的数量多得惊人。

这个思想和语法来自ADA编程语言。这里是< case specification >正式的BNF语法:

<case specification> ::= <simple case> | <searched case>
<simple case> ::=
CASE <case operand>
<simple when clause>...
[<else clause>]
END
<searched case> ::=
CASE
<searched when clause>...
[<else clause>]
END
<simple when clause> ::= WHEN <when operand> THEN <result>
<searched when clause> ::= WHEN <search condition> THEN <result>
<else clause> ::= ELSE <result>
<case operand> ::= <value expression>
<when operand> ::= <value expression>
<result> ::= <result expression> | NULL
<result expression> ::= <value expression>

1.搜索格式的CASE表达式

搜索格式的CASE表达式可能是使用最多的表达式版本。WHEN...THEN...子句按照从左向右的顺序执行。第一个测试结果为TRUE的 WHEN子句将返回在它的THEN子句中给出的值可以在CASE表达式中再嵌套CASE表达式。如果对于CASE表达式没有显式地给出ELSE子句,则数据库将插入一个隐式的ELSE NULL子句。如果要在THEN子句中返回NULL,必须使用CAST(NULL AS <数据类型>)表达式。我建议总是给出ELSE子句,这样当你以后发现需要显式地返回某些值时,可以更改它。

2.简单的CASE表达式

<简单的CASE表达式>定义为:在搜索格式的CASE表达式中,所有的WHEN子句都对<case 操作数>做相等性比较。例如

CASE iso_sex_code
WHEN 0 THEN 'Unknown'
WHEN 1 THEN 'Male'
WHEN 2 THEN 'Female'
WHEN 9 THEN 'N/A'
ELSE NULL END

也可以写成:

CASE
WHEN iso_sex_code = 0 THEN 'Unknown'
WHEN iso_sex_code = 1 THEN 'Male'
WHEN iso_sex_code = 2 THEN 'Female'
WHEN iso_sex_code = 9 THEN 'N/A'
ELSE NULL END

但是这个定义中有一个技巧。表达式

CASE foo
WHEN 1 THEN 'bar'
WHEN NULL THEN 'no bar'
END

变成:

CASE WHEN foo = 1 THEN 'bar'
WHEN foo = NULL THEN 'no_bar' --错误!
ELSE NULL END

第二个WHEN子句总是UNKNOWN。如果简单的CASE表达式适合使用,那么就使用它。

3.其他CASE表达式

SQL-92标准中以CASE表达式的方式定义了其他函数,这样语言会更紧凑一些,并易于实现。例如,COALESCE()函数可以通过下列方式为一个或两个表达式定义:

(1) COALESCE (<value exp #1>)与(<value exp #1>)相同;
(2) COALESCE (<value exp #1>, <value exp #2>)等同于

CASE WHEN <value exp #1> IS NOT NULL
THEN <value exp #1>
ELSE <value exp #2> END

这样我们可以在列表中为n个表达式递归地定义它,这里n>=3:

CASE WHEN <value exp #1> IS NOT NULL
THEN <value exp #1>
ELSE COALESCE (<value exp #2>, ..., n)
END

同样,NULLIF (<value exp #1>, <value exp #2>)等同于

CASE WHEN <value exp #1> = <value exp #2>
THEN NULL
ELSE <value exp #1> END

使用这些CASE表达式中最紧凑的格式,不要将它们扩展到它们的定义之外。

分享到:
评论

相关推荐

    Hibernate HQL基础 限定查询条件 .doc

    Case 语句允许在HQL中进行条件分支判断,类似于SQL中的CASE表达式。它可以用于根据不同的条件返回不同的值。 10. **成员运算符**: `member of`和`not member of`用于判断对象是否属于一个集合,例如,`from ...

    HIVE函数详解大全

    10. JAVA 的 LIKE 操作:`RLIKE` - 类似于LIKE,但使用正则表达式进行匹配。 11. REGEXP 操作:`REGEXP` - 使用正则表达式进行精确匹配。 二、数学运算 数学运算符用于对数值进行基本的算术操作: 1. 加法操作:`...

    Hive函数大全.pdf

    在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,为...在实际使用中,结合HQL(Hive Query Language)的其他特性,可以实现复杂的数据处理任务。记住,合理运用这些函数可以提高数据处理效率和查询的准确性。

    Java 学习笔记极其详细版(包括一些个人色彩不仅仅是纯笔记)

    - HQL查询语言的使用。 3. **Struts**: - Struts框架的配置。 - Action类的设计。 #### 设计模式 1. **常见设计模式**: - 单例模式、工厂模式、抽象工厂模式。 - 观察者模式、策略模式、适配器模式。 2. **...

    weibo_summer.zip

    Hive提供了一系列函数,如`COALESCE`用于处理NULL值,`DISTINCT`去除重复行,以及`CASE WHEN`语句进行条件判断。 3. **数据转换**:在数据清洗后,我们需要将数据转换为适合分析的格式。这可能包括日期解析、文本...

    Java语言基础下载

    在Java中使用HQL 709 内容总结 712 独立实践 712 第三十七章 Spring介绍 713 学习目标 713 Spring简介 714 IOC控制反转 714 Spring的容器 715 AOP面向切面编程 715 AOP的专业术语 715 Spring事务管理 718 Spring与...

    BAT数据分析面经笔试题

    **解释**:此SQL语句使用了CTE(Common Table Expression,公共表表达式)来定义一个名为`RankedScores`的临时视图,该视图包含原始表中的`name`和`score`字段,并通过`RANK()`函数计算每个学生的排名。最终选择所有...

    java知识全集

    - **查询语言**: HQL和Criteria API的使用。 - **分页查询**: 实现分页查询的方法。 - **排序和过滤**: 对查询结果进行排序和过滤。 **5.5 Hibernate知识辅导(3--1)** - **会话管理**: Session和SessionFactory...

    Apache hive常用函数.zip

    Apache Hive 是一个基于Hadoop的数据仓库工具,它允许用户通过SQL-like查询语言(HQL)对存储在Hadoop分布式文件系统(HDFS)中的大规模数据集进行分析和处理。本资料"Apache Hive常用函数.zip"包含了一份详尽的...

    第十一节、HIVE常用操作.pdf1

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许通过SQL-like查询语言(HQL)来处理存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。本篇将详细介绍Hive的一些常用操作,包括数据操作、函数...

    hive的函数大全.rar

    Hive函数是Hive查询语言(HQL)的核心组成部分,它们允许用户执行各种数据操作,如数据清洗、转换、聚合等。以下是一些关键的Hive函数类别及其应用: 1. **算术函数**:这些函数用于执行基本的数学运算,如`+`、`-`...

    hive函数大全(举例和目录)

    类似于`LIKE`,但使用Java正则表达式进行模式匹配。 **示例**: ```sql SELECT * FROM table WHERE col1 RLIKE 'pattern'; ``` ##### 11. `REGEXP` 操作 用于执行正则表达式匹配。 **示例**: ```sql SELECT * FROM...

    JAVA+JSP+Servlet+android+SSH视频教程全集+项目视频 亲自总结

    1. **基础语法**:包括变量定义、数据类型(基本类型与引用类型)、运算符、流程控制语句(if-else、switch-case、循环结构等)。 2. **面向对象编程**: - 类与对象的概念; - 继承与多态性; - 抽象类与接口; ...

    Impala用户指南

    - **条件函数**:如IF(条件表达式)、CASE WHEN(多条件判断)等。 - **字符函数**:如UPPER(转大写)、LOWER(转小写)、TRIM(去除空格)等。 - **聚合函数**:如COUNT(计数)、SUM(求和)、AVG(平均值)等。 #### 2.4 ...

    Hive用户指南(Hive_user_guide)_中文版

    - **REGEXColumnSpecification**:使用正则表达式匹配列 ```sql SELECT * FROM sales WHERE product REGEXP '^a'; ``` #### 三、Hive Select **3.1 GroupBy** - 分组查询 ```sql SELECT product, SUM(amount...

    Struts2标签库详解

    这通过创建一个实现ognl表达式解析、标签处理等功能的标签库动态代理类(Tag Library Descriptor,TLD)来实现。 四、Struts2标签库的国际化与主题 Struts2支持多语言环境,可以通过配置资源文件实现国际化。同时...

    各种框架说明

    - **OGNL**(Object-Graph Navigation Language):一种强大的表达式语言,用于数据获取和更新。 **控制器** - **Action接口**:Struts2的核心控制器接口。 - **ActionSupport类**:提供了错误消息处理等功能的抽象...

    hibernate 教程

    大小写敏感性(Case Sensitivity) 11.2. from 子句 11.3. 联合(Associations)和连接(joins) 11.4. select子句 11.5. 统计函数(Aggregate functions) 11.6. 多态(polymorphism)查询 11.7. ...

Global site tag (gtag.js) - Google Analytics