我正在尝试加入两个地址表,但我遇到了麻烦,因为当街道是数字时,它们在街道名称上并不相似。例如。当第一个表格街道名称等于“第二个”时,第二个表格街道名称等于“2”。因此,街道尽头的标签将从第二个表格中排除。这些表有超过十万行。如果有必要,我可以将标签添加到街道的尽头,但我也想不出有什么好办法可以做到这一点。
到目前为止,这是我的代码:
select * from address a
inner join mai_address ma on ma.hse_nbr=a.number and a.street=ma.street
由于此问题,查询不包含任何带数字的街道。
感谢您的帮助。
答案 0 :(得分:1)
您能够将这种逻辑添加到数据库中的唯一方法是创建一个函数来去除您不想要的文本。但是,在函数包含的字段上连接两个表的效率非常低。
更好的解决方案是创建函数,但使用它来更新两个表中的新字段并加入该表。这可以在触发器上完成
即:
create trigger dbo.address_update
on dbo.address
after insert, update
as
begin
update address a
set processed_street = ProcessStreet(street)
join inserted i
on i.unique_field = a.unique_field;
end;
答案 1 :(得分:1)
选择*
from address inner join mai_address on dbo.f1(mai_address.hse_nbr) = address.street
函数f1(@str)应该返回" @ str"的左侧数字。参数(直到达到字符串的非数字或结尾)。像这样:
create function dbo.f1(@str Varchar(10))将varchar(10)作为
返回Begin define @str2 varchar(10) define @i int set @str2 = '' set @i = 1 while ((@i <= len(@str)) and (substring(@str, @i, @i) between '0' and '9')) begin @str2 = concat(@str2, substring(@str, @i, @i)) set @i = @i + 1 end return @str2 end
答案 2 :(得分:0)
这就是我所做的。
CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%', @strText) > 0
BEGIN
SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')
END
RETURN @strText
END
然后加入我做了这个:
select * from address a
inner join mai_address ma on ma.hse_nbr=a.number and (a.street=ma.street OR dbo.fnRemoveNonNumericCharacters(ma.street)=a.street)
and (ma.unit_nbr=a.apt OR (ma.unit_nbr IS NULL AND a.apt IS NULL))
order by a.number
我使用该函数修改列值,因此它不包含文本。我还使用了或者加入了没有包含数字的街道名称。
感谢您的好主意!