如何创建查询以加入2个不完全匹配的表中的地址字段

时间:2017-01-16 22:48:26

标签: sql sql-server

我有两张类似数据的表格:办公室名称,街道地址,城市,州,邮编和电话号码。

我需要编写一个查询,查找Table1但不在Table2中的办事处和地址。查询条件是办公室名称和街道地址,但由于缩写(Road vs RD,Street vs ST),空格,句点等,街道地址不完全匹配。

有没有办法使用like声明加入街道地址字段?例如,Table1可能将我的医疗中心作为办公室名称,街道地址为123 Main ST,Table2将我的医疗中心作为办公室名称,街道地址为123 Main Street。

我可以加入办公室名称和街道地址的数字部分(123)吗?

1 个答案:

答案 0 :(得分:0)

以下是我在项目中使用的

CREATE FUNCTION [dbo].[fn_GetAddrMatchedKey] 
(
@ZipCode VARCHAR(15)='',
@FirstName NVARCHAR(50)='',
@LastName NVARCHAR(50)='',
@BusiName NVARCHAR(300)='',
@Address1 NVARCHAR(100)='',
@Address2 NVARCHAR(100)='',
@CountryCode VARCHAR(100)=''
)
 RETURNS VARCHAR(100)
AS
BEGIN

DECLARE @Key VARCHAR(50)='',@Name VARCHAR(200),@s VARCHAR(100)




-- 1--6
-- Collection zipcoode
DECLARE @Zip VARCHAR(15)
SET @Zip=replace(replace(@ZipCode,' ',''),'-','') +'      '    
SET @Zip=LEFT( CASE WHEN @CountryCode='US' THEN LEFT(@Zip,5) ELSE  @Zip END,6)
SET @Key=@Key+@Zip


---7--10
--collect name
DECLARE @Vowel VARCHAR(300),@Consonant VARCHAR(300)

SET @Name= UPPER(COALESCE(NULLIF(@LastName,''),NULLIF(@BusiName,''),''))
SET @Name=isnull(dbo.fn_RegExReplace(@Name, '%[^a-Z0-9]%', '',NULL),'')
SET @Key=@Key+LEFT(@Name+' ',1)
IF LEN(@Name)<2
BEGIN
    SET @Key=@Key+'   '
END
ELSE
BEGIN

    SET @Name=SUBSTRING(@Name,2,LEN(@Name)-1)   
    SET @Vowel=dbo.fn_RegExReplace(@Name, '%[^AEIOU]%', '',NULL)
    SET @Consonant=dbo.fn_RegExReplace(@Name, '%[AEIOU]%', '',NULL)

    IF LEN(@Consonant)>=3
    BEGIN
        SET @Key=@Key+LEFT(@Consonant,3)
    END
    ELSE
    BEGIN
        IF len(@Vowel)<3 SET @Key=@Key+'   '
        ELSE

        SET @Key=@Key+left(dbo.fn_RegExReplace(@Name, '%[AEIOU]%', '',len(@Vowel)-(3-LEN(@Consonant))),3)
    END
END
--- 11--13
-- Get three digits number from address
--RETURN @Key
DECLARE @p INT
SET @s=ISNULL(nullif(ltrim(@Address1),''),@Address2)+' '

SET @s= '000'+SUBSTRING(@s, PATINDEX('%[0-9]%',@s),PATINDEX('%[0-9][^0-9]%',@s)-PATINDEX('%[0-9]%',@s)+1)
SET @Key=@Key+RIGHT(@s,3)


---- 14--14
SET @Key=@Key+left(ISNULL(upper(@FirstName),'')+' ',1)

-- 15--15
SET @Key=@Key+'1'


RETURN @Key

- 用RegEx替换功能 使用此函数来获取或删除特殊字符

    CREATE FUNCTION [dbo].[fn_RegExReplace] 
    (
        @string VARCHAR(MAX),
        @substring VARCHAR(MAX),
        @replacement VARCHAR(MAX),
        @ReplaceCount INT
    )
    RETURNS VARCHAR(max)
    AS
    BEGIN
        DECLARE @sRet VARCHAR(MAX)
        DECLARE @iPos INT=1,@Count INT=0
        IF isnull(@ReplaceCount,0)<1 SET @ReplaceCount=len(@string)

        WHILE @iPos>0 AND @Count<@ReplaceCount
        BEGIN
           SET @iPos=PATINDEX(@substring,@string)
            IF @iPos>0
            BEGIN
               SET @Count=@Count+1
               SET @sRet=isnull(@sRet,'')+left(@string,@iPos-1)+@replacement
               SET @string=substring(@string,@iPos+1,CASE WHEN len(@string)<=@iPos THEN LEN(@string) ELSE len(@string)-@iPos END)
            END
            ELSE
            BEGIN
              SET @iPos=0
              SET @sRet=isnull(@sRet,'')+@string
            END
            IF @Count=@ReplaceCount
            BEGIN
               SET @sRet=isnull(@sRet,'')+@string
            END

        END
        RETURN @sRet

    END


END