Oracle查询需求:手机号非空时置空邮箱,否则保留原邮箱
实现EMPLOYEES表的邮箱地址条件置空查询
表结构与数据
创建表的SQL:
create table employees (empno int primary key, empname varchar(30), emailaddress varchar(30), phonenumber varchar(10))
表中现有数据:
| EMPNO | EMPNAME | EMAILADDRESS | PHONENUMBER |
|---|---|---|---|
| 1 | Emma | emma@gmail.com | 82354566 |
| 2 | Tom | tom@gmail.com | 984537665 |
| 3 | Bob | Bob@gmail.com |
查询需求
当员工的phonenumber非空时,将其emailaddress置为空值;否则保留原emailaddress。期望查询结果:
| EMPNO | EMPNAME | EMAILADDRESS | PHONENUMBER |
|---|---|---|---|
| 1 | Emma | 82354566 | |
| 2 | Tom | 984537665 | |
| 3 | Bob | Bob@gmail.com |
错误SQL与报错
尝试的SQL语句存在语法错误:
select * case when phonenumber is not null then '' as emailaddress end from employees
触发报错:ORA-00923: FROM keyword not found where expected
正确解决方案
问题分析
原SQL的错误点:
SELECT *后未添加逗号,导致后续CASE表达式语法混乱;AS emailaddress的位置错误,应放在CASE表达式末尾,而非THEN子句后;- 使用空字符串
''不符合Oracle对空值的定义(Oracle中''等价于NULL,但直接使用NULL更清晰)。
方案1:CASE表达式实现
select empno, empname, case when phonenumber is not null then null else emailaddress end as emailaddress, phonenumber from employees;
方案2:Oracle专用NVL2函数简化
利用Oracle内置的NVL2函数可以更简洁地实现需求:
select empno, empname, nvl2(phonenumber, null, emailaddress) as emailaddress, phonenumber from employees;
NVL2(expr1, expr2, expr3)的逻辑:若expr1非空则返回expr2,否则返回expr3,完全匹配需求中的条件判断。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

