LIKE操作符
我 们可以使用LIKE操作符来判断一个字符、字符串或CLOB类型的值是不是与我们指定的样式相匹配。如果样式匹配,LIKE就会返回TRUE,否则返回 FALSE。用于LIKE匹配的样式中,包含两种通配符。下划线(_):精确匹配一个字符;百分号(%):匹配零个或多个字符。如下面的例子中,如果 ename的值是"JOHNSON",那么表达式结果就为TRUE:
ename LIKE 'J%SON'
BETWEEN操作符
BETWEEN操作符用于判断目标值是否在指定的目标范围内。例如,下面表达式的结果就为FALSE:
45 BETWEEN 38 AND 44
IN操作符
IN操作符是用于测试目标值是否是集合成员之一。其中,集合是可以包含NULL值的,但它们是被忽略的。例如,下面这个语句并不会删除ename值为NULL的行:
DELETE FROM emp
WHERE ename IN (NULL, 'KING', 'FORD');
双竖线(||)可以当作字符连接操作符,可以将两个字符串(CHAR、VARCHAR2、CLOB或等价的Unicode支持的类型)连接起来。例如表达式
'suit' || 'case'
返回的结果就是
'suitcase'
如果操作符两边的操作数都是CHAR类型,连接操作符返回的结果就是CHAR值。如果其中一个是CLOB值,操作符就返回临时CLOB。其余情况均返回VARCHAR2类型。
布尔字符表达式
我们也可以比较字符的等或不等。默认情况下,比较都是基于字符串中每个字节的二进制值的。比如,下面例子中的表达式结果就为真:
string1 := 'Katdy';
string2 := 'Katdleen';
string1 > string2 -- TRUE
设置初始化参数NLS_COMP=ANSI,就能使用初始化参数 NLS_SORT指定的整理序列(collating sequence)来进行比较。整理序列是一个字符集中表现字符的数字代码(numeric code)的内部顺序,如果一个字符的数字代码比另一个大,那这个字符就比另一个字符大。关于字符在整理序列中出现的位置,每种语言都可能有不同的定义规 则。比如说,重音字母可能会因数据库的字符集的不同而排序不同,即使每一种情况下的二进制值都相同。
布尔日期表达式
对于日期类型的比较,是按照年代的顺序的。如下例,date1的值是大于date2的值的。
date1 := '01-JAN-91';
date2 := '31-DEC-90';
date1 > date2 -- TRUE
在作比较时使用括号是一个好习惯。例如,下面的这样的表达式形式是不允许的,因为 100 < tax 的结果是布尔型,而布尔型是不能和数字500进行比较的。
100 < tax < 500 -- not allowed
解决方法是使用下面这样的表达式:
(100 < tax) AND (tax < 500)
CASE表达式
一个CASE表达式从一个或多个供选方案中选择一个返回结果。CASE表达式使用一个选择器来决定返回哪一个分支的结果。具体的语法形式如下:
CASE selector
WHEN expression1 tdEN result1
WHEN expression2 tdEN result2
...
WHEN expressionn tdEN resultn
[ELSE resultN+1]
END;
选择器后面跟着一个或多个WHEN子句,它们会被依次验证的。一旦有一个WHEN子句满足条件的话,剩下的分支条件就不再执行了。例如:
DECLARE
grade CHAR(1) := 'B';
appraisal VARCHAR2(20);
BEGIN
appraisal := CASE grade
WHEN 'A' tdEN 'Excellent'
WHEN 'B' tdEN 'Very Good'
WHEN 'C' tdEN 'Good'
WHEN 'D' tdEN 'Fair'
WHEN 'F' tdEN 'Poor'
ELSE 'No such grade'
END;
END;
其中,ELSE子句是可选的,工作方式同IF语句中的ELSE子句相似。如果我们不提供ELSE子句,并且选择器没有匹配任何WHEN子句,表达式的返回的结果就是NULL。
这种形式的CASE表达式的另外一种使用方法就是CASE语句,其中每个WHEN子句都可以是一个完整的PL/SQL块。
• 搜索式CASE表达式
PL/SQL也提供了搜索式的CASE表达式,它的语法形式如下:
CASE
WHEN expression1 tdEN result1
WHEN expression2 tdEN result2
...
WHEN expressionn tdEN resultn
[ELSE resultN+1]
END;
搜索式CASE表达式没有选择器。每个WHEN子句包含一个能返回布尔值的搜索条件。例子如下:
DECLARE
grade CHAR(1);
appraisal VARCHAR2(20);
BEGIN
...
appraisal := CASE
WHEN grade = 'A' tdEN 'Excellent'
WHEN grade = 'B' tdEN 'Very Good'
WHEN grade = 'C' tdEN 'Good'
WHEN grade = 'D' tdEN 'Fair'
WHEN grade = 'F' tdEN 'Poor'
ELSE 'No such grade'
END;
...
END;
搜 索条件按顺序计算。搜索条件的布尔值决定了哪个WHEN子句被执行。如果搜索条件的值为TRUE,它对应的WHEN子句就会被执行。只要其中一个WHEN 子句被执行,后续的搜索条件就不会被计算了。如果没有匹配的条件,可选的ELSE就会被执行。如果没有匹配的WHEN子句,也没有ELSE子句,表达式的 结果就为NULL。
函数
如果给内置函数传递空值,一般也都会返回空值,但以下几种情况除外。
函数DECODE 将它的第一个参数和后面的一个或多个表达式相比较(表达式的值有可能为空),如果比较的内容相匹配,就会返回后面的结果表达式。例如在下面的例子中,如果字段rating的值为空,DECODE就会返回1000:
SELECT DECODE(rating,
NULL, 1000,
'C', 2000,
'B', 4000,
'A', 5000
)
INTO credit_limit
FROM accts
WHERE acctno = my_acctno;
函数NVL 在判断出第一个参数是空的情况下,会返回第二个参数的值,否则直接返回第一个参数的值。使用方法如下:
start_date := NVL(hire_date, SYSDATE);
函数REPLACE第二个参数是NULL的时候,它就会返回第一个参数的值,不管是否有第三个参数。例如,在下面例子中,结果字符串new_string的值和old_string的值完全一样。
new_string := REPLACE(old_string, NULL, my_string);
如果第三个参数为空的话,REPLACE就会把第一个参数中出现的第二个参数删除,然后返回结果。如下面这个例子:
syllabified_name := 'gold - i - locks';
NAME := REPLACE(syllabified_name,
' - ',
NULL
);
运算的结果字符串是"goldilocks"。如果第二个和第三个参数都是NULL值,REPLACE就直接返回第一个参数。
内置函数
PL/SQL为我们提供了许多功能强大的数据操作函数。这些函数可以分为以下几类:
1. 错误报告
2. 数字
3. 字符
4. 类型转换
5. 日期
6. 对象引用
7. 杂项