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表达式中最紧凑的格式,不要将它们扩展到它们的定义之外。
分享到:
相关推荐
Case 语句允许在HQL中进行条件分支判断,类似于SQL中的CASE表达式。它可以用于根据不同的条件返回不同的值。 10. **成员运算符**: `member of`和`not member of`用于判断对象是否属于一个集合,例如,`from ...
10. JAVA 的 LIKE 操作:`RLIKE` - 类似于LIKE,但使用正则表达式进行匹配。 11. REGEXP 操作:`REGEXP` - 使用正则表达式进行精确匹配。 二、数学运算 数学运算符用于对数值进行基本的算术操作: 1. 加法操作:`...
在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,为...在实际使用中,结合HQL(Hive Query Language)的其他特性,可以实现复杂的数据处理任务。记住,合理运用这些函数可以提高数据处理效率和查询的准确性。
- HQL查询语言的使用。 3. **Struts**: - Struts框架的配置。 - Action类的设计。 #### 设计模式 1. **常见设计模式**: - 单例模式、工厂模式、抽象工厂模式。 - 观察者模式、策略模式、适配器模式。 2. **...
Hive提供了一系列函数,如`COALESCE`用于处理NULL值,`DISTINCT`去除重复行,以及`CASE WHEN`语句进行条件判断。 3. **数据转换**:在数据清洗后,我们需要将数据转换为适合分析的格式。这可能包括日期解析、文本...
在Java中使用HQL 709 内容总结 712 独立实践 712 第三十七章 Spring介绍 713 学习目标 713 Spring简介 714 IOC控制反转 714 Spring的容器 715 AOP面向切面编程 715 AOP的专业术语 715 Spring事务管理 718 Spring与...
**解释**:此SQL语句使用了CTE(Common Table Expression,公共表表达式)来定义一个名为`RankedScores`的临时视图,该视图包含原始表中的`name`和`score`字段,并通过`RANK()`函数计算每个学生的排名。最终选择所有...
- **查询语言**: HQL和Criteria API的使用。 - **分页查询**: 实现分页查询的方法。 - **排序和过滤**: 对查询结果进行排序和过滤。 **5.5 Hibernate知识辅导(3--1)** - **会话管理**: Session和SessionFactory...
Apache Hive 是一个基于Hadoop的数据仓库工具,它允许用户通过SQL-like查询语言(HQL)对存储在Hadoop分布式文件系统(HDFS)中的大规模数据集进行分析和处理。本资料"Apache Hive常用函数.zip"包含了一份详尽的...
在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许通过SQL-like查询语言(HQL)来处理存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。本篇将详细介绍Hive的一些常用操作,包括数据操作、函数...
Hive函数是Hive查询语言(HQL)的核心组成部分,它们允许用户执行各种数据操作,如数据清洗、转换、聚合等。以下是一些关键的Hive函数类别及其应用: 1. **算术函数**:这些函数用于执行基本的数学运算,如`+`、`-`...
类似于`LIKE`,但使用Java正则表达式进行模式匹配。 **示例**: ```sql SELECT * FROM table WHERE col1 RLIKE 'pattern'; ``` ##### 11. `REGEXP` 操作 用于执行正则表达式匹配。 **示例**: ```sql SELECT * FROM...
1. **基础语法**:包括变量定义、数据类型(基本类型与引用类型)、运算符、流程控制语句(if-else、switch-case、循环结构等)。 2. **面向对象编程**: - 类与对象的概念; - 继承与多态性; - 抽象类与接口; ...
- **条件函数**:如IF(条件表达式)、CASE WHEN(多条件判断)等。 - **字符函数**:如UPPER(转大写)、LOWER(转小写)、TRIM(去除空格)等。 - **聚合函数**:如COUNT(计数)、SUM(求和)、AVG(平均值)等。 #### 2.4 ...
- **REGEXColumnSpecification**:使用正则表达式匹配列 ```sql SELECT * FROM sales WHERE product REGEXP '^a'; ``` #### 三、Hive Select **3.1 GroupBy** - 分组查询 ```sql SELECT product, SUM(amount...
这通过创建一个实现ognl表达式解析、标签处理等功能的标签库动态代理类(Tag Library Descriptor,TLD)来实现。 四、Struts2标签库的国际化与主题 Struts2支持多语言环境,可以通过配置资源文件实现国际化。同时...
- **正则表达式**:Java提供了Pattern和Matcher类来支持正则表达式的使用。 - **反射机制**:反射允许在运行时访问和修改类、字段和方法的信息。 #### 二、数据库 - **SQL语句**:SQL是用于访问和处理关系数据库的...
- **OGNL**(Object-Graph Navigation Language):一种强大的表达式语言,用于数据获取和更新。 **控制器** - **Action接口**:Struts2的核心控制器接口。 - **ActionSupport类**:提供了错误消息处理等功能的抽象...
大小写敏感性(Case Sensitivity) 11.2. from 子句 11.3. 联合(Associations)和连接(joins) 11.4. select子句 11.5. 统计函数(Aggregate functions) 11.6. 多态(polymorphism)查询 11.7. ...