求一个解决方法,当条件值为空时连接条件无效。

[复制链接]
查看11 | 回复8 | 2015-3-4 14:54:27 | 显示全部楼层 |阅读模式
已知有两张表结构如下:
create table BS_COL_REALESTATE(
clt_no varchar2(32) not null,
province varchar2(20) not null,--省/直辖市/自治区
city varchar2(20) not null, --城市/自治州
district varchar2(20)
);
create table EVAL_CONDITIONS(
id varchar2(32) not null,
province varchar2(20) not null, --省/直辖市/自治区
city varchar2(20) not null, --城市/自治州
district varchar2(20)--区(县)
);
还有一张表:ap_sys_area(国家行政区域表),记录各个区域的父子关系,区域等级信息。
我想要实现的功能是:根据表EVAL_CONDITIONS的字段province,city,district从BS_COL_REALESTATE找出符合的记录。
其中省、城市不为空值,但区(县)为空时要找出城市下辖的所有记录。本身为一个存储过程,可以引入中间变量,但不知道怎么实现。
求各位大神指点指点。
select *
from BS_COL_REALESTATE t1, EVAL_CONDITIONS t2
where t1.province = t2.province
and t1.city = t2.city
and t1.district = t2.district; --当t2.district 为NULL值时这个连接条件无效


回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
为空连接条件自动无效
回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
方法1:
先判断区县是否为空,不为空则执行带有district条件的SQL,为空则执行另一个没有district条件的SQL。
方法2:
用UNION 将区县为空和不为空的查询结果合并
select *
from BS_COL_REALESTATE t1, (select * from EVAL_CONDITIONS where district is not null) t2
where t1.province = t2.province
and t1.city = t2.city
and t1.district = t2.district
union
select *
from BS_COL_REALESTATE t1, (select * from EVAL_CONDITIONS where district is null) t2
where t1.province = t2.province
and t1.city = t2.city;

回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
select *
from BS_COL_REALESTATE t1, EVAL_CONDITIONS t2
where t1.province = t2.province
and t1.city = t2.city
and (( t2.district is not null and t1.district = t2.district ) or t2.district is null );
回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
bfc99 发表于 2015-2-10 09:58
方法1:
先判断区县是否为空,不为空则执行带有district条件的SQL,为空则执行另一个没有district条件的SQ ...

nvl进行连接,然后在select里面用case when做个判断?
回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
Naldonado 发表于 2015-2-10 12:06
nvl进行连接,然后在select里面用case when做个判断?

没太明白,能否给个代码?
回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
bfc99 发表于 2015-2-10 15:49
没太明白,能否给个代码?

跟楼上意思一样,我刚没看到,以为两个都是null,想使用nvl(,'-1')=nvl(,'-1')这种
回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
and t1.district = nvl(t2.district,t1.district)
不知道数据是怎么样的,可能会笛卡尔积
回复

使用道具 举报

千问 | 2015-3-4 14:54:27 | 显示全部楼层
4 楼不就行了?is not null 也可以不写,因为等值匹配就意味着非空。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行