提问人:Advait Advait 提问时间:12/20/2022 最后编辑:Advait Advait 更新时间:12/20/2022 访问量:121
(初级)如何从 Oracle 内部联接语句结果中排除 null 值以及如何在任何属性中仅显示 null 数据
(Beginner) How to exclude null value from Oracle Inner Join Statement Result and How to show ONLY null data in any of the attributes
问:
(初级)
Q1) 如何从 Oracle 内部连接语句结果中排除 null 值。即仅显示具有所有值的那一行(即任何属性中都没有空数据)
Q2) 如何仅显示那些在四个表中的任何一个属性中缺少/空数据的记录
下面是 oracle sql 中的虚拟示例
创建了 4 个表,即 姓名 , 详细信息 , 社交 , 地址
`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);`
对于第一季度,
我尝试了下面的oracle sql查询(两者都返回相同的结果),但无法找出确切的查询,该查询将从Oracle内部连接语句结果中排除null值,并仅显示具有所有值的那行(即不为空)
`select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, address
from name, details, social, address
where name.id=details.id
and details.id=social.id
and social.id=address.id;
select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, address
from name join details on name.id=details.id
join social on details.id=social.id
join address on social.id=address.id;`
对于第 2 季度,我正在寻找示例查询 即如何仅显示那些在四个表中的任何一个属性中缺少/空数据的记录
答:
1赞
Wernfried Domscheit
12/20/2022
#1
对于第一个问题,我认为您正在寻找这个:
select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, 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 dob_year is not null
and dob_day is not null
and telephone is not null
and ssn is not null
and address is not null;
或者短一点
...
where COALESCE(dob_year, dob_day, telephone, ssn, address) is not null;
对于第二季度,它将是这样的
select *
from address
where id is null
or address is null;
更多说明:
存储日期部分,然后存储本地化字符串是一个糟糕的设计。你永远不应该那样做。就你而言,它应该是
create table details
(
id number,
dob_date DATE
);
那么下一个问题,为什么要创建四个表?也许你在学校学到了数据库规范化,但你太从字面上理解了。一个人可以拥有多个 SSN/电话吗?如果没有,则将这些列添加到表中(并可能将其重命名为 ),而不是单独的表。同样的问题也适用于表。name
person
address
评论
0赞
Advait Advait
12/20/2022
对于 Q2) 我基本上是在寻找我从你的 Q1 的答案中得到的这个,选择 name.id、名字、姓氏、dob_month、dob_year、ssn、电话、地址,地址从姓名 name.id=details.id 上的完整外部加入详细信息 details.id=social.id 上的完整外部加入社交 social.id=address.id 上的完整外部加入地址,其中 firstname 为 null 或 lastname 为 null 或 dob_month为 null 或 dob_year为 null 或电话为 null 或 ssn 为null 或 address 为 null;
0赞
Advait Advait
12/20/2022
使用COALESCE它会抛出错误,知道如何解决吗?ORA-00932:不一致的数据类型:预期的 CHAR 编号为 00932。00000 - “不一致的数据类型:预期的 %s 得到了 %s” *原因: *操作:查询 select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, address from name join details on name.id=details.id join social on details.id=social.id join address on social.id=address.id 其中 COALESCE(dob_year, dob_day, telephone, ssn, address) 不为 null;
0赞
Wernfried Domscheit
12/20/2022
哦,是的,要求所有参数都是相同的类型。根据您的具体情况跳过它。我认为对于初学者来说,第一个解决方案无论如何都更容易理解。COALESCE
评论