TD逻辑与条件表达式

逻辑与条件表达式
用户利用SELECT语句进行数据查询时,无论是描述想要的查询结果,还是规
定查询的约束条件,均要使用相应的逻辑和条件表达式来实现。本章将详细介绍
Teradata支持的各种逻辑和条件表达式

5.1 5.1 5.1 逻辑表达式运算符
逻辑表达式由运算符和操作数两部分组成,其结果是一个布尔值(True/False)。
这种表达式可以用在WHERE子句的条件表达式中。 标准的逻辑表达式运算符种类如表5-1所示: 表5-1 逻辑表达式运算符分类

5.2 逻辑表达式
下面分别讨论各种逻辑表达式的操作。
5.2.1 5.2.1 5.2.1 5.2.1 [NOT] BETWEEN...AND 
BETWEEN <a> AND <b>表示某列数值(数字型或字符型)介于a和b之间,且包
括a和b。举例来说,在雇员表中把所有工作代码以43开头的员工的姓名及其经理的员
工代码找出来。可以使用下面的SQL语句,其中第二个查询就使用了BETWEEN ... 
AND操作符。
SELECT first_name 
 ,last_name 
 ,manager_employee_number 
FROM employee 
WHERE job_code >= 430000 AND 
 job_code <= 439999; 
SELECT first_name 
 ,last_name 
 ,manager_employee_number 
FROM employee 
WHERE job_code BETWEEN 430000 AND 439999;

需要注意的是,当操作数是字符时,ANSI标准是区分大小写的,而Teradata中
缺省不区分大小写,但可以通过CASESPECIFIC/NOT CASESPECIFIC来明确定义
是否区分。如:
 SELECT ... 
 WHERE last_name (CASESPECIFIC); 
 SELECT ... 
 WHERE last_name (NOT CASESPECIFIC); 
查询姓以字母R开头的员工,可以使用下面的SQL语句:
SELECT last_name 
FROM employee 
WHERE last_name BETWEEN 'r' AND 's'; 
由于Teradata的缺省方式不区分大小写,因此,Ryan、Roger等都将作为结果
返回。如果显示区分大小写,上面的表达式中必须使用大写字母R和S。


5.2.2 集合操作符[NOT] IN 
[NOT] IN表示某列数值属于或不属于某个集合。对于显示列举的数据集合,
IN和OR可以相互替代使用。例如:在员工表中查找部门代码在401403之间的员工
姓名和相应的部门代码,可以使用下面两个SQL语句,它们的作用是等同的。显
然,当要列举的数据值很多时,用OR就不如用IN方便和简洁。
SELECT first_name 
 ,last_name 
 ,department_number 
FROM employee 
WHERE department_number = 401 
 OR department_number = 403; 
SELECT first_name 
 ,last_name 
 ,department_number 
FROM employee 
WHERE department_number IN (401, 403); 
反过来,如果查找部门代码不属于401403的员工姓名和部门代码,则可以
使用下面的SQL语句,它们也是等价的。
SELECT first_name 
 ,last_name 
 ,department_number 
FROM employee 
WHERE NOT (department_number = 401 
 OR department_number = 403);
 
 
 
SELECT first_name 
 ,last_name 
 ,department_number 
FROM employee 
WHERE department_number NOT IN (401, 403); 
5.2.3 匹配符LIKE 
LIKE用来进行字符串数据的模式匹配。用作匹配的字符串中可以包含下面的 通配符。! %:表示除了 NULL 外的零个或多个字符组成的字符串。 ! _:表示任何单个字符位置。
从下面的例子可以清楚地了解这两个通配符的使用方法:
表达式 含义
LIKE 'JO%' ‘JO’在开始位置的任意字符串
LIKE '%JO%' ‘JO'在任何位置的字符串
LIKE '%HN' 'HN'在结束位置的任意字符串
LIKE '%H_' 'H'在倒数第二个位置时的任意字符串
LIKE '__HN%’ ‘HN’分别在第三和第四位置的任意字符串 
在使用LIKE进行字符串匹配时,要特别注意字符的大小写。ANSI标准中是区
分大小写的,如果不要区分大小写,可以使用UPPER函数将其转换成大写字母来
进行匹配。Teradata缺省不区分大小写,如果要区分,可以使用其扩展参数
CASESPECIFIC

例如:查询员工姓中有’Ra’字符的员工,可以根据是否区分大小写而分别使用
下面的SQL语句:
不区分大小写 不区分大小写 不区分大小写 不区分大小写
1.在Teradata缺省模式下
SELECT first_name 
 ,last_name 
FROM employee 
WHERE last_name LIKE '%Ra%'; 
2.在ANSI缺省模式下
SELECT first_name 
 ,last_name 
FROM employee 
WHERE UPPER (last_name) LIKE UPPER ('%Ra%'); 
区分大小写 区分大小写 区分大小写 区分大小写
1.在Teradata缺省模式下
SELECT first_name 
 ,last_name 
FROM employee 
WHERE last_name (CASESPECIFIC) LIKE '%Ra%'; 
2.在ANSI缺省模式下
SELECT first_name 
 ,last_name 
FROM employee 
WHERE last_name LIKE '%Ra%';
 
 
 
LIKE中限定词的使用 中限定词的使用 中限定词的使用 中限定词的使用
利用一些限定词可以扩充LIKE在字符串匹配方面的功能。可以使用的限定词
包含:
限定词 含义
ANY 与一个或多个数值匹配
SOME (ANY的同义词) 同上
ALL 与列举的所有数值匹配
例如:查询员工姓中任意位置有字母’E’和’S’的员工,可以使用下面的SQL语 句。
SELECT first_name 
 ,last_name 
FROM employee 
WHERE last_name LIKE ALL ('%E%', '%S%');

如果改变一下上面的问题,要求查找员工姓中任意位置有字母’E’或者’S’的员
工,则应使用ANY或SOME。
SELECT first_name 
 ,last_name 
FROM employee 
WHERE last_name LIKE ANY ('%E%', '%S%');

通配符作为一般字符使用 通配符作为一般字符使用

前面谈到,在LIKE结构的字符串中,'%''_'可以作为通配符使用,但是如果 需要匹配这些字符本身(比如查找95%),即把它们作为一般字符时使用,该如何区 分呢?
我们可以通过定义ESCAPE字符来达到这个目的,紧跟在ESCAPE字符后的’%’
和’_’作为一般字符看待。
模式 含义
<ESCAPE char>_ _ (下划线)作为一个字符
<ESCAPE char>% % (百分号)作为一个字符
<ESCAPE char><ESCAPE char> ESCAPE字符本身



例:
LIKE ''%A%%AAA__'' ESCAPE ''A'' 
在这个表达式中,将字母A定义为ESCAPE字符,其中: ! 第一个%为通配符; ! 第一个 A 和其后的%联合表示字符%; ! 第三个%为通配符; ! 第二个 A 和其后的 A 联合表示字符 A; ! 第四个 A 和其后的’_’联合表示字符_; ! 最后一个’_’为通配符。 例如,下面的SQL语句可用来查找Teradata RDBMS数据字典中对象名称中第
二个字符为’_’的所有对象。
SELECT tvmname 
FROM dbc.tvm
WHERE tvmname LIKE ''_Z_%'' ESCAPE ''Z' 
; 


5.3 NULL的使用
NULL是SQL的一个关键字,在数据库的操作中有很重要的作用,下面是一些
关于NULL的说明:
! NULL 显示没有数据的字段
! NULL 表示不存在或未发现的值
! NULL 既不是数字类型也不是字符类型
! 具有 NULL 值的字段可以被压缩,不占任何空间
NULL也可以参与运算,其运算规则为:
! NULL 在算术运算中产生的结果为 NULL() 
! NULL 在比较运算中产生的结果为 False 
! UNKNOWN DATA, MISSING DATA 和 NULL 是同样的含义 ! 当进行升序排列时,NULL 在数字列排列在负数前,在字符列排列在空格
前。
下面给出了一些实例:



NULL也可以用在SQL的SELECT中,如找出没有或未知分机号码的员工,使 用下面的SQL语句:
SELECT employee_number 
FROM employee_phone 
WHERE extension IS NULL; 
反过来,找出有分机号码的员工,则可以使用:
SELECT employee_number 
FROM employee_phone 
WHERE extension IS NOT NULL;


5.4 条件表达式
条件表达式是可以通过逻辑运算符来构造的,系统中的逻辑运算符为:
运算符 含义
AND 所有条件都必须成立
OR 其中任何一个条件成立即可
NOT 否定,即对条件求反
使用一个或多个逻辑运算符可以表现一些复杂的关系


5.4.1 AND 
AND连接两个或两个以上条件表达式。如果所有条件同时为真,则表达式结
果为真;否则表达式结果为假。
例:查找收入小于35000并且部门号为403的员工姓名,可以使用下面的SQL语 句:
SELECT first_name 
 ,last_name 
 ,employee_number 
FROM employee 
WHERE salary_amount < 35000.00 
 AND department_number = 403;
 
5.4.2 OR 
OR连接两个或两个以上条件表达式。如果任何一个条件为真,则表达式结果
为真;如果所有条件均为假,则表达式结果为假。
例:查找收入小于35000或部门号为403的员工姓名。
SELECT first_name 
 ,last_name 
 ,employee_number 
FROM employee 
WHERE salary_amount < 35000.00 
 OR department_number = 403; 
5.4.3 多个AND . . . OR 
例:查找部门号是403401,并且工作号为412101432101的员工姓、部门
号和工作号。
SELECT last_name 
 ,department_number 
 ,job_code 
FROM employee 
WHERE (department_number = 401 
 OR department_number = 403) 
 AND ( job_code = 412101 
 OR job_code = 432101);

5.4.4 优优先级和括号 先级和括号
括号也是逻辑运算符,可用来改变逻辑运算的优先级。如果条件表达式中不
使用括号,逻辑运算符的缺省优先级顺序从高到低为:NOT、AND、OR。
为了避免出错,应尽量使用括号来显示地指定运算秩序。
5.4.5 NOT 
NOT既可以否定操作符,也可以否定条件表达式。 例;查找部门号不是301的员工姓名及其代码。 否定操作符: 
SELECT first_name 
 ,last_name 
 ,employee_number 
FROM employee 
WHERE department_number NOT = 301; 
否定条件:
SELECT first_name 
 ,last_name 
 ,employee_number 
FROM employee

WHERE NOT (department_number = 301); 
 


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值