先进行一下简单的说明:
表tblb的address字段可能是包含了表tbla的address字段的内容,如果确实是包含了,那么返回tbla中的项目名称。
以前用游标来实现的功能,大概要写个几十行,现在用Like来实现,只要一句SQL就行了,感觉方便多了。
不过没有在大数据量的情况之下进行测试。
代码如下:
--先建立2个表格
create table tbla (ename varchar(50) ,address varchar(50))
create table tblb (address varchar(50))
insert into tbla values('金顺小区','金顺里x号')
insert into tbla values('华小园','华小园xx号院')
insert into tbla values('通天院项目','通天苑x号楼')
insert into tblb values('南开华小园xx号院')
insert into tblb values('华山通天苑x号楼1111')
insert into tblb values('东城区金顺里x号100')
go
--drop table tbla
--drop table tblb
--通过派生表来实现,派生表只能在本语句中使用
select *
from
(
select case when b.address like '%'+a.address+'%'
then a.address
else NULL
end as simple_address,
a.ename as building,
b.address as more_address
from tbla a
cross join tblb b
) derive
where simple_address is not null
/*
simple_address building more_address
金顺里x号 金顺小区 东城区金顺里x号100
华小园xx号院 华小园 南开华小园xx号院
通天苑x号楼 通天院项目 华山通天苑x号楼1111
*/
在SQL Server 2005中可以通过通用表表达式CTE来实现,代码如下:
--通过CTE来实现,在批处理级别使用
with derive(building,simple_address,more_address)
as
(select a.ename as building,
case when b.address like '%'+a.address+'%'
then a.address
else NULL
end as simple_address,
b.address as more_address
from tbla a
cross join tblb b
)
select * from derive
where simple_address is not null