首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建查询以连接两个不完全匹配的表中的地址字段

如何创建查询以连接两个不完全匹配的表中的地址字段
EN

Stack Overflow用户
提问于 2017-01-17 06:48:26
回答 1查看 486关注 0票数 0

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

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

有没有办法使用like语句连接街道地址字段?例如,Table1的办公室名称可能是My Medical Center,街道地址为123 Main ST,而Table2的办公室名称可能是My Medical Center,街道地址为123 Main Street。

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

EN

回答 1

Stack Overflow用户

发布于 2017-01-17 09:51:02

以下是我在我的项目中使用的

代码语言:javascript
复制
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替换函数使用此函数获取或删除特定字符

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41686277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档