Oracle OCP认证考试题目详解082系列第49题
一、考察的知识点摘要
本题主要考察对Oracle数据库中 NULLIF
和 COALESCE
这两个函数的语法规则和返回值逻辑的理解。核心知识点包括:
NULLIF(expr1, expr2)
函数:比较两个表达式。如果二者相等,返回NULL
;如果不相等,返回第一个表达式expr1
的值。特别注意:第一个参数expr1
不能直接为字面量NULL
。COALESCE(expr1, expr2, ..., expr_n)
函数:返回参数列表中第一个非空(NOT NULL)表达式的值。如果所有参数均为NULL
,则返回NULL
。该函数需要至少两个参数。- 数据类型一致性:在调用这些函数时,提供的参数应在数据类型上是兼容或可隐式转换的,否则可能导致错误。
二、英文题目与答案
题目:Which two queries execute successfully?
A. SELECT NULLIF(100, 100) FROM DUAL;
B. SELECT NULLIF(100, 'A') FROM DUAL;
C. SELECT COALESCE(100, 'A') FROM DUAL;
D. SELECT COALESCE(100, NULL, 200) FROM DUAL;
E. SELECT NULLIF(NULL, 100) FROM DUAL;
正确答案:A 和 D
三、题目翻译
哪两个查询可以成功执行?
A. SELECT NULLIF(100, 100) FROM DUAL;
B. SELECT NULLIF(100, 'A') FROM DUAL;
C. SELECT COALESCE(100, 'A') FROM DUAL;
D. SELECT COALESCE(100, NULL, 200) FROM DUAL;
E. SELECT NULLIF(NULL, 100) FROM DUAL;
四、题目解析
- 选项A解析:正确执行。
NULLIF(100, 100)
比较两个数值100。由于它们相等,根据函数定义,返回NULL
。这是一个有效的函数调用,查询语法正确。 - 选项B解析:执行错误。
NULLIF(100, 'A')
试图比较一个数字(100)和一个字符串(‘A’)。在Oracle数据库中,数字和字符串属于不同的数据类型。虽然数据库可能尝试隐式转换,但在严格的类型检查或无法进行合理转换的场景下,这种类型不匹配可能导致错误。 - 选项C解析:执行错误。
COALESCE(100, 'A')
试图返回第一个非NULL值。这里100是数字,'A’是字符串。COALESCE
函数要求所有参数的数据类型一致或可隐式转换为同一类型。数字和字符串的混合类型通常会导致错误。 - 选项D解析:正确执行。
COALESCE(100, NULL, 200)
从参数列表中寻找第一个非NULL值。第一个参数100就是非NULL的,因此函数返回100。这是一个语法和逻辑都正确的COALESCE
函数调用,符合其需要至少两个参数的要求。 - 选项E解析:执行错误。
NULLIF(NULL, 100)
的第一个参数直接是字面量NULL
。根据NULLIF
函数的定义,第一个参数不允许为字面量NULL
。虽然逻辑上比较NULL
和100不相等应返回第一个参数NULL
,但Oracle语法规则明确禁止这种写法,会导致错误。
五、考察的知识点详情
-
NULLIF
函数深度解析:- 逻辑等价:
NULLIF(expr1, expr2)
在逻辑上完全等价于以下的CASE
表达式:CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
- 返回值类型:
NULLIF
函数的返回值数据类型与第一个参数expr1
的数据类型相同。 - 常见应用场景:
- 防止除零错误:在除法运算中,使用
NULLIF
将分母为零的情况转换为NULL
,从而避免运行时错误。例如:SELECT 100 / NULLIF(0, 0) FROM DUAL;
结果是NULL
而非错误。 - 数据清洗:将数据中特定的占位符(如表示无效值的999)转换为
NULL
。例如:SELECT NULLIF(salary, 999) FROM employees;
。
- 防止除零错误:在除法运算中,使用
- 逻辑等价:
-
COALESCE
函数深度解析:- 逻辑等价:
COALESCE(expr1, expr2, ..., expr_n)
可以用CASE
表达式实现:
最简单的形式CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE COALESCE(expr2, ..., expr_n) END
COALESCE(expr1, expr2)
等价于:CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
- 短路评估(Short-circuit Evaluation):Oracle数据库在计算
COALESCE
函数时采用短路评估。它会从左到右依次评估参数,一旦找到第一个非NULL值,就立即返回该值,并停止评估后续参数。这能提升性能。 - 与
NVL
函数的关系:COALESCE
是NVL
函数的泛化。NVL(expr1, expr2)
等价于COALESCE(expr1, expr2)
,但COALESCE
可以接受两个以上的参数,更为灵活。
- 逻辑等价:
-
关键区别与注意事项:
- 核心功能:
NULLIF
用于在特定条件(两值相等)下产生NULL
;而COALESCE
用于从一系列值中寻找第一个非NULL
值。 - 参数限制:
NULLIF
必须且只能接受两个参数。COALESCE
必须接受至少两个参数。 - 数据类型一致性:两个函数都要求参数数据类型兼容。不兼容的数据类型(如选项B和C中的数字和字符串直接比较)是常见的错误来源。
NULL
字面量的使用:特别注意NULLIF
函数的第一个参数不能是字面量NULL
(如选项E),这是一个语法限制。
- 核心功能:
希望这份详细的解析能帮助你彻底理解 NULLIF
和 COALESCE
函数的相关知识。如果对SQL中的其他函数或概念还有疑问,我们可以继续探讨。