我有两张类似数据的表格:办公室名称,街道地址,城市,州,邮编和电话号码。
我需要编写一个查询,查找Table1
但不在Table2
中的办事处和地址。查询条件是办公室名称和街道地址,但由于缩写(Road vs RD,Street vs ST),空格,句点等,街道地址不完全匹配。
有没有办法使用like
声明加入街道地址字段?例如,Table1
可能将我的医疗中心作为办公室名称,街道地址为123 Main ST,Table2
将我的医疗中心作为办公室名称,街道地址为123 Main Street。
我可以加入办公室名称和街道地址的数字部分(123)吗?
答案 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