我有两个表有相似的数据:办公室名称,街道地址,城市,州,邮政编码和电话号码。
我需要编写一个查询来查找存在于Table1中但不存在于Table2中的办公室和地址。查询条件是办公室名称和街道地址,但是由于缩写(Road vs RD,street vs ST)、空格、句号等原因,街道地址并不完全匹配。
有没有办法使用like语句连接街道地址字段?例如,Table1的办公室名称可能是My Medical Center,街道地址为123 Main ST,而Table2的办公室名称可能是My Medical Center,街道地址为123 Main Street。
我可以只加入办公室名称和街道地址的数字部分(123)吗?
发布于 2017-01-17 09:51:02
以下是我在我的项目中使用的
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
ENDhttps://stackoverflow.com/questions/41686277
复制相似问题