Home Forums SQL Server 2008 T-SQL (SS2K8) How to make Soundex functions include the first letter RE: How to make Soundex functions include the first letter

  • I'm not sure if this helps.

    I sure had fun replicating the SOUNDEX function which I then changed it into the DIFFERENCE function, all by keeping it as an inline table-valued function to help performance.

    CREATE FUNCTION iFullDifference(

    @String1 varchar(30),

    @String2 varchar(30)

    ) RETURNS TABLE WITH SCHEMABINDING

    AS

    RETURN

    WITH

    E(n) AS(

    SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)

    ),

    E2(n) AS(

    SELECT a.n FROM E a UNION ALL SELECT a.n FROM E a

    ),

    cteTally(n) AS(

    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n

    FROM E2

    ),

    cteNumbers AS(

    SELECT n,

    NULLIF(

    CASE WHEN SUBSTRING( @String1, n, 1) LIKE '[bfpv]' THEN 1

    WHEN SUBSTRING( @String1, n, 1) LIKE '[cgjkqsxz]' THEN 2

    WHEN SUBSTRING( @String1, n, 1) LIKE '[dt]' THEN 3

    WHEN SUBSTRING( @String1, n, 1) LIKE '[l]' THEN 4

    WHEN SUBSTRING( @String1, n, 1) LIKE '[mn]' THEN 5

    WHEN SUBSTRING( @String1, n, 1) LIKE '[r]' THEN 6

    END,

    CASE WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[hw]'

    THEN

    CASE WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[bfpv]' THEN 1

    WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[cgjkqsxz]' THEN 2

    WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[dt]' THEN 3

    WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[l]' THEN 4

    WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[mn]' THEN 5

    WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[r]' THEN 6

    END

    ELSE

    CASE WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[bfpv]' THEN 1

    WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[cgjkqsxz]' THEN 2

    WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[dt]' THEN 3

    WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[l]' THEN 4

    WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[mn]' THEN 5

    WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[r]' THEN 6

    END

    END) num

    FROM cteTally

    WHERE SUBSTRING( @String1, n, 1) NOT LIKE '[aeiouyhw]'

    AND n <= LEN(@String1)

    ),

    cteNumbers2 AS(

    SELECT n,

    NULLIF(

    CASE WHEN SUBSTRING( @String2, n, 1) LIKE '[bfpv]' THEN 1

    WHEN SUBSTRING( @String2, n, 1) LIKE '[cgjkqsxz]' THEN 2

    WHEN SUBSTRING( @String2, n, 1) LIKE '[dt]' THEN 3

    WHEN SUBSTRING( @String2, n, 1) LIKE '[l]' THEN 4

    WHEN SUBSTRING( @String2, n, 1) LIKE '[mn]' THEN 5

    WHEN SUBSTRING( @String2, n, 1) LIKE '[r]' THEN 6

    END,

    CASE WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[hw]'

    THEN

    CASE WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[bfpv]' THEN 1

    WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[cgjkqsxz]' THEN 2

    WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[dt]' THEN 3

    WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[l]' THEN 4

    WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[mn]' THEN 5

    WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[r]' THEN 6

    END

    ELSE

    CASE WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[bfpv]' THEN 1

    WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[cgjkqsxz]' THEN 2

    WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[dt]' THEN 3

    WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[l]' THEN 4

    WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[mn]' THEN 5

    WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[r]' THEN 6

    END

    END) num

    FROM cteTally

    WHERE SUBSTRING( @String2, n, 1) NOT LIKE '[aeiouyhw]'

    AND n <= LEN(@String2)

    )

    SELECT SUM( CASE WHEN ISNULL( a.num, 0) = ISNULL( b.num, 0) THEN 1 ELSE 0 END) Difference

    FROM cteTally t

    LEFT

    JOIN (

    SELECT TOP 4 ROW_NUMBER() OVER(ORDER BY n) n, num

    FROM cteNumbers

    WHERE num IS NOT NULL) a ON t.n = a.n

    LEFT

    JOIN (

    SELECT TOP 4 ROW_NUMBER() OVER(ORDER BY n) n, num

    FROM cteNumbers2

    WHERE num IS NOT NULL) b ON t.n = b.n

    WHERE t.n <= 4

    GO

    SELECT *, DIFFERENCE(String1, String2)

    FROM (VALUES( 'Kolton', 'Colton')) x(String1, String2) --This is sample data.

    CROSS APPLY iFullDifference(String1, String2)

    GO

    DROP FUNCTION iFullDifference

    Luis C.
    General Disclaimer:
    Are you seriously taking the advice and code from someone from the internet without testing it? Do you at least understand it? Or can it easily kill your server?

    How to post data/code on a forum to get the best help: Option 1 / Option 2