以下是我在我的項目
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 @[email protected][email protected]
---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 @[email protected]+LEFT(@Name+' ',1)
IF LEN(@Name)<2
BEGIN
SET @[email protected]+' '
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 @[email protected]+LEFT(@Consonant,3)
END
ELSE
BEGIN
IF len(@Vowel)<3 SET @[email protected]+' '
ELSE
SET @[email protected]+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 @[email protected]+RIGHT(@s,3)
---- 14--14
SET @[email protected]+left(ISNULL(upper(@FirstName),'')+' ',1)
-- 15--15
SET @[email protected]+'1'
RETURN @Key
使用 - 用正則表達式替換功能 使用此功能來獲得或刪除字符調校妥當
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 @[email protected]+1
SET @sRet=isnull(@sRet,'')+left(@string,@iPos-1)[email protected]
SET @string=substring(@string,@iPos+1,CASE WHEN len(@string)<[email protected] THEN LEN(@string) ELSE len(@string)[email protected] END)
END
ELSE
BEGIN
SET @iPos=0
SET @sRet=isnull(@sRet,'')[email protected]
END
IF @[email protected]
BEGIN
SET @sRet=isnull(@sRet,'')[email protected]
END
END
RETURN @sRet
END
END
你能加樣的數據? – DVT
有沒有簡單的方法來做到這一點。您可以使用一系列已知縮寫的替換來嘗試清理數據,並使用子字符串和強制轉換來比較numeric和varchar,但只是想到它會受到傷害。 –
就我的情況而言,我會討論地址的主要特性,以便根據自己的算法生成一個字符串 –