SQL - 在具有相似值的列上连接两个表

时间:2014-06-09 16:08:55

标签: sql sql-server

我正在尝试加入两个地址表,但我遇到了麻烦,因为当街道是数字时,它们在街道名称上并不相似。例如。当第一个表格街道名称等于“第二个”时,第二个表格街道名称等于“2”。因此,街道尽头的标签将从第二个表格中排除。这些表有超过十万行。如果有必要,我可以将标签添加到街道的尽头,但我也想不出有什么好办法可以做到这一点。

到目前为止,这是我的代码:

select * from address a
inner join mai_address ma on ma.hse_nbr=a.number and a.street=ma.street

由于此问题,查询不包含任何带数字的街道。

感谢您的帮助。

3 个答案:

答案 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

我使用该函数修改列值,因此它不包含文本。我还使用了或者加入了没有包含数字的街道名称。

感谢您的好主意!