http://qml007.blog.163.com/blog/static/5134854200610159394453/
应用难点技巧:使用Case让你的SQL语句有条件的执行
我们在编写SQL语句时,常常遇到希望SQL能够按条件执行的情况。这里的条件不是指Where子句中的条件,而是指让DB2根据条件执行SQL的语句块。大多数情况下我们可以使用case来实现。
例如,我们希望从员工表中查出员工的工资情况,如果小于20000,则标志为low,20000到50000间为middle,否则为high。一般大家会想到先取出工资数据然后在Java代码中做判断,但我们也可以在SQL中完成上述操作。如下例:
select empno, sex, salary,
case
when salary < 20000 then 'low'
when salary >=20000 and salary <50000 then 'middle'
else 'high'
end as salaryclass
from employee
类似的,如果想在SQL语句中把性别翻译成文字,也可以用case实现,注意这两条SQL语句使用了不同的case表达式写法:
select empno,
case sex
when 'M' then 'male'
when 'F' then 'female'
else 'invalid'
end,
salary
from employee
Case不但能够在Select子句中使用,在From子句和Where子句中同样可以使用。下面是在Where子句中使用的一个例子:
select empno, sex, age
from employee
where
case sex
when 'M' then 55
when 'F' then 50
end > age
在From子句中使用的例子极为少见,下面是一个极端的例子。在合同表ctrct_list、客户表customer和订单表quote中都有合同号字段,但订单表中的合同号可能为空。要求查询出订单表订单id和合同号,如订单表中合同号为空的话,查出客户表中相应的合同号。
select distinct
q.quote_id,
case rtrim(coalesce(q.ctrct_num, ''))
when '' then rtrim(coalesce(c.ctrct_num, ''))
else rtrim(coalesce(q.ctrct_num, ''))
end ctrct_num
from
(quote q
left outer join customer c
on q.sold_to_cust_num = c.cust_num)
inner join ctrct_list cl
on cl.cust_num = q.sold_to_cust_num
and cl.ctrct_num = (
case rtrim(coalesce(q.ctrct_num, ''))
when '' then c.ctrct_num
else q.ctrct_num
end
)
有时让SQL语句有条件的执行也可以不使用case。下面是一个例子:
select *
from EMPLOYEE
WHERE
((job='MANAGER') AND vMgrFlag=1)
or
((job='DESIGNER' or job='ANALYST') AND vTechFlag =1)
or
((job='CLERK' or job='OPERATOR') AND vOfficeFlag=1)
此SQL可以要求根据标志位的不同选择出不同类型的雇员。各个标志位在执行SQL前应提前设置好。这种方法可以在某些情况下将动态SQL改写为静态SQL,因此在编写存储过程时非常实用。但要指出的是,DB2的查询优化器不可能将这种SQL也优化得非常高效,因此在数据量比较大时可能会带来性能问题。开发人员需要在编写完成后使用实际数据测试,必要的话进行性能优化。
此篇文章没有完全解决问题,经过查询,以下代码将问题解决
动态匹配查询条件的问题,如果MY_NAME==null那么忽略查询条件
MY_NAME = CASE :name WHEN 'null' THEN MY_NAME ELSE :name END
当null 值,MY_NAME =MY_NAME 相当于忽略
分享到:
相关推荐
### DB2自动生成数据库的语句 #### 一、引言 在数据库管理与开发过程中,经常需要创建或重建数据库来满足不同的需求场景。对于IBM的DB2数据库管理系统而言,如何利用DB2命令行工具自动生成数据库是一个重要的技能点...
DB2支持标准SQL语句,并提供了一些扩展功能。 - **DDL**: DDL(Data Definition Language)用于定义数据库对象,如创建表(`CREATE TABLE`)、修改表(`ALTER TABLE`)等。 ##### 4. **数据库安全性** - **用户权限**...
### 常用DB2操作命令使用 #### DB2系统命令概述 在DB2数据库管理系统中,为了方便管理员和开发人员进行高效的管理与维护工作,IBM提供了大量的命令行工具。这些命令涵盖了安装、配置、管理和故障排查等多个方面,...
### DB2数据库SQL语句大全 #### 1. 强制关闭所有应用程序 ```sql db2forceapplicationall ``` 此命令用于强制关闭所有正在运行的应用程序,确保在进行维护操作之前所有的应用程序都已关闭。 #### 2. 在线备份...
在Java环境中,为了连接到DB2数据库,我们需要使用特定的驱动程序,这些驱动程序通常以JAR(Java Archive)文件的形式存在。在您提供的标题和描述中,提到了三个重要的JAR文件:“db2jcc.jar”,“db2jcc_javax.jar...
【DB2常用语句集萃】中的知识点涵盖了SQL查询的多个方面,主要涉及了数据的检索、聚合、分组、转换以及联接操作。以下是对这些知识点的详细说明: 1. **空值处理**:使用`ISNULL`函数来处理NULL值,例如`isnull...
在Java应用程序中,要连接到DB2数据库,就需要使用相应的数据库驱动,即JDBC驱动。"db2jcc4.jar"是IBM提供的DB2 JDBC Type 4驱动程序,它实现了Java Database Connectivity (JDBC) API,允许Java应用程序通过网络与...
这样,Java应用程序就能通过JDBC API与DB2 11.5数据库进行交互,执行SQL语句,处理结果集,以及进行事务控制等操作。理解这些组件的作用和用法,对于开发和维护与DB2数据库交互的Java应用至关重要。
2. **打开控制中心**:使用`db2cmd db2cc`命令可以打开DB2控制中心,这是一个图形用户界面,用于管理和监控数据库。 3. **打开命令编辑器**:`db2cmd db2ce`命令启动DB2命令编辑器,便于编写和执行多行SQL语句。 4...
本文将深入探讨DB2数据库中的SQL注入语句,以及如何通过这些语句来猜解数据库结构和数据。 首先,SQL注入的基础原理是通过在合法的SQL查询语句中嵌入恶意代码,以改变原本的查询逻辑。在给定的示例中,攻击者试图猜...
### Toad for DB2 使用指南知识点详解 #### 一、Toad for DB2 概述 Toad for DB2 是一款强大的数据库管理工具,专为 IBM DB2 数据库设计,旨在帮助开发人员和数据库管理员提高工作效率。该软件提供了丰富的功能集,...
- `#db2-tvf scripts.sql`:执行存储在`scripts.sql`文件中的SQL语句。 **21. 查看命令帮助** - `#db2?db2start`:查看`db2start`命令的帮助信息。 - `#db2?22001`:查看错误代码22001的详细信息。 - 使用`db2...
本教程将详细介绍 DB2 Merge 语句的使用方法。 首先,让我们通过一个简单的例子来理解 DB2 Merge 语句的工作原理。假设我们有两个表,一个是雇员表(EMPLOYE),另一个是经理表(MANAGER)。这两个表都有员工号...
以下是一些关于DB2的常用SQL语句,它们涵盖了查询、聚合、条件过滤、转换等功能,对于理解和操作DB2数据库非常有帮助: 1. **查询员工信息**:这条语句通过`ISNULL`函数处理出生日期为空的情况,将其替换为“日期不...
根据提供的文件信息,本文将对SQL Server、Oracle与DB2三种主流关系型数据库管理系统中的SQL语句进行详细的对比分析。这不仅有助于理解不同数据库系统之间的差异,也为开发人员提供了跨平台迁移时所需的必要知识。 ...
使用db2licm -a 绝对路径 如 db2licm -a d:\xxx.lic 可成功导入Lincense,亲自试过,可以用,希望可以帮到需要的人。 Product name: "DB2 Enterprise Server Edition" License type: "CPU 选项" Expiry date...
DB2使用小结.chm文档格式,希望能够帮到需要学习的朋友。
为了更好地进行性能分析,可以将这些文本数据导入到DB2表中,并使用SQL查询来获取更有价值的信息,例如执行时间最长的语句、不同语句的执行频度等。 #### 五、转换工具源代码示例 下面提供了一个简单的C语言程序...