You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle内连接空值处理:排除空值与仅显示含空值记录

Oracle SQL 空值过滤问题(初学者)

问题描述

  • 问题1:如何在Oracle内连接结果中排除空值,仅显示所有属性均不为空的行
  • 问题2:如何仅显示四张表中任意属性存在空值/缺失的记录

示例表结构与测试数据

创建表

create table name
(
id number,
firstname varchar2(20),
lastname varchar2(20)
);

create table details
(
id number,
dob_month varchar2(20),
dob_day varchar2(20),
dob_year varchar2(20)
);

create table social
(
id number,
ssn varchar2(20),
telephone number
);

create table address
(
id number,
address varchar2(20)
);

插入测试数据

insert into name values (1, 'Will' , 'Smith');
insert into name values (2, 'Barry' , 'White');
insert into name values (3, 'Tom' , 'Jones');
insert into name values (4, 'Rod' , 'Stewart');
insert into name values (5, 'Elvis' , 'Presley');

insert into details values (1,'May',31,null);
insert into details values (2,'August',22,1980);
insert into details values (3,'October',null,1973);
insert into details values (4,'January',30,1980);
insert into details values (5,'March',11,1980);

insert into social values (1,'123-45-6789',null);
insert into social values (2,'222-45-5555',789456123);
insert into social values (3,'333-45-7777',888888888);
insert into social values (4,null,693456741);
insert into social values (5,'999-45-1111',null);

insert into address values (null, null);
insert into address values (2, '12th street');
insert into address values (null, null);
insert into address values (4, '14th Avenue');
insert into address values (5, null);

问题1 解决方案

你之前的查询仅完成了表的内连接,没有添加空值过滤条件。要筛选出所有属性均不为空的行,需要在WHERE子句中明确指定所有需要检查的列都不为空:

SELECT 
    name.id, firstname, lastname,
    dob_month, dob_day, dob_year,
    ssn, telephone, address.address
FROM name
JOIN details ON name.id = details.id
JOIN social ON details.id = social.id
JOIN address ON social.id = address.id
WHERE 
    -- name表属性非空
    name.id IS NOT NULL
    AND firstname IS NOT NULL
    AND lastname IS NOT NULL
    -- details表属性非空
    AND details.dob_month IS NOT NULL
    AND details.dob_day IS NOT NULL
    AND details.dob_year IS NOT NULL
    -- social表属性非空
    AND social.ssn IS NOT NULL
    AND social.telephone IS NOT NULL
    -- address表属性非空
    AND address.id IS NOT NULL
    AND address.address IS NOT NULL;

执行此查询后,只会返回所有属性都无空值的记录(你的测试数据中仅id=2的记录符合条件)。


问题2 解决方案

要筛选出任意属性存在空值的记录,我们可以使用左连接保留所有关联的记录,然后在WHERE子句中判断任意一列是否为空:

SELECT 
    name.id AS name_id, firstname, lastname,
    details.id AS details_id, dob_month, dob_day, dob_year,
    social.id AS social_id, ssn, telephone,
    address.id AS address_id, address
FROM name
LEFT JOIN details ON name.id = details.id
LEFT JOIN social ON name.id = social.id
LEFT JOIN address ON name.id = address.id
WHERE 
    -- 任意一列为空即满足条件
    name.id IS NULL
    OR firstname IS NULL
    OR lastname IS NULL
    OR details.dob_month IS NULL
    OR details.dob_day IS NULL
    OR details.dob_year IS NULL
    OR social.ssn IS NULL
    OR social.telephone IS NULL
    OR address.id IS NULL
    OR address.address IS NULL;

如果只需要内连接后的记录中存在空值的行,只需将LEFT JOIN替换为JOIN即可。


内容的提问来源于stack exchange,提问作者Advait Advait

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:35:11